2012-11-27 55 views
2

後,我有一個XML文件,如下 propNode.xml合併使用XSLT兩個XML文件中讀取第三xml文件

<NODES> 
    <NODE> 
<NODELINE CLASS="Item" TYPE="Item" > 
    <ATTR_NODES> 
    <ATTR_NODE NAME="myName" /> 
    <ATTR_NODE NAME="myDesc /> 
    </ATTR_NODES> 
</NODELINE> 
<NODELINE CLASS="Item1" TYPE="Item1" > 
    <ATTR_NODES> 
    <ATTR_NODE NAME="myName1" /> 
    <ATTR_NODE NAME="myDesc1" /> 
    </ATTR_NODES> 
</NODELINE> 
<NODELINE CLASS="Item2" TYPE="Item2" > 
    <ATTR_NODES> 
    <ATTR_NODE NAME="myName2" /> 
    <ATTR_NODE NAME="myDesc2" /> 
    </ATTR_NODES> 
</NODELINE> 
</NODE> 
</NODES> 

我想讀這個XML和使用它,我需要合併以下兩個XML文件 source.xml

<NODES> 
    <NODE> 
<NODELINE CLASS="Item" TYPE="Item" > 
    <ATTR_NODES> 
    <ATTR_NODE NAME="myName" VALUE="myNameValue" /> 
    <ATTR_NODE NAME="myDesc" VALUE="test-myDescValue" /> 
<ATTR_NODE NAME="myId" VALUE="test-myIdValue" /> 
    </ATTR_NODES> 
</NODELINE> 
<NODELINE CLASS="Item1" TYPE="Item1" > 
    <ATTR_NODES> 
    <ATTR_NODE NAME="myName1" VALUE="myNameValue1" /> 
    <ATTR_NODE NAME="myDesc1" VALUE="myDescValue1"/> 
<ATTR_NODE NAME="myId1" VALUE="myIdValue1" /> 
    </ATTR_NODES> 
</NODELINE> 
<NODELINE CLASS="Item2" TYPE="Item2" > 
    <ATTR_NODES> 
    <ATTR_NODE NAME="myName2" VALUE="test-myNameValue2" /> 
    <ATTR_NODE NAME="myDesc2" VALUE="myDescValue2"/> 
<ATTR_NODE NAME="myId2" VALUE="test-myIdValue2" /> 
    </ATTR_NODES> 
</NODELINE> 
    </NODE> 
</NODES> 

而且target.xml

<NODES> 
    <NODE> 
<NODELINE CLASS="Item" TYPE="Item" > 
    <ATTR_NODES> 
    <ATTR_NODE NAME="myName" VALUE="myNameValue" /> 
    <ATTR_NODE NAME="myDesc" VALUE="myDescValue" /> 
<ATTR_NODE NAME="myId" VALUE="myIdValue" /> 
    </ATTR_NODES> 
</NODELINE> 
<NODELINE CLASS="Item1" TYPE="Item1" > 
    <ATTR_NODES> 
    <ATTR_NODE NAME="myName1" VALUE="myNameValue1" /> 
    <ATTR_NODE NAME="myDesc1" VALUE="myDescValue1"/> 
<ATTR_NODE NAME="myId1" VALUE="myIdValue1" /> 
    </ATTR_NODES> 
</NODELINE> 
<NODELINE CLASS="Item2" TYPE="Item2" > 
    <ATTR_NODES> 
    <ATTR_NODE NAME="myName2" VALUE="myNameValue2" /> 
    <ATTR_NODE NAME="myDesc2" VALUE="myDescValue2"/> 
<ATTR_NODE NAME="myId2" VALUE="myIdValue2" /> 
    </ATTR_NODES> 
</NODELINE> 
    </NODE> 
</NODES> 

條件正在讀取propNode.xml,如果@NAME的值在source.xml和target.xml匹配,則@VALUE在source.xml和target.xml的值需要進行比較,並輸出XML應如下創建:

desiredOutput.xml

<NODES> 
    <NODE> 
<NODELINE CLASS="Item" TYPE="Item" > 
    <ATTR_NODES> 
    <ATTR_NODE NAME="myName" SRCVALUE="myNameValue" TGTVALUE="myNameValue" ISDIFF="false" /> 
    <ATTR_NODE NAME="myDesc" SRCVALUE="test-myDescValue" TGTVALUE="myDescValue" ISDIFF="true" /> 
    </ATTR_NODES> 
</NODELINE> 
<NODELINE CLASS="Item1" TYPE="Item1" > 
    <ATTR_NODES> 
    <ATTR_NODE NAME="myName1" SRCVALUE="myNameValue1" TGTVALUE="myNameValue1" ISDIFF="false" /> 
    <ATTR_NODE NAME="myDesc1" SRCVALUE="myDescValue1" TGTVALUE="myDescValue1" ISDIFF="false" /> 
    </ATTR_NODES> 
</NODELINE> 
<NODELINE CLASS="Item2" TYPE="Item2" > 
    <ATTR_NODES> 
    <ATTR_NODE NAME="myName2" SRCVALUE="test-myNameValue2" TGTVALUE="myNameValue2" ISDIFF="true" /> /> 
    <ATTR_NODE NAME="myDesc2" SRCVALUE="myDescValue2" TGTVALUE="myDescValue2" ISDIFF="false" /> 
    </ATTR_NODES> 
</NODELINE> 
    </NODE> 
</NODES> 

的desiredOutput.xml應從源同時包含@VALUE的值與目標如果值在propNode.xml中選擇了@NAME。如果@VALUE的值不同,@ISDIFF應該有一個值「true」或者「false」。

使用xslt可以完成整個操作嗎?就像使用propNode.xml生成xsl然後將其應用於source.xml和target.xml以生成所需的輸出一樣?這個xsl看起來怎麼樣?

+0

你能確認propnode.xml也應該有一個''在第一個'ATTR_NODES'元件,因爲這是存在於源極在,目的地以及所需的輸出? – StuartLC

+0

@StuartLC是的,對不起我的壞。我現在編輯它。感謝您指出。 – MartinKahn

+0

更新了我的xslt - 必須!=當然... – StuartLC

回答

1

假設只有節點(ATTR_NODE)目前在propNode.xml需要進行測試,下面的XSLT應該做的工作:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:my="some.uri" version="1.0"> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="ATTR_NODE"> 
     <xsl:variable name="NodeLine" select="../../@CLASS" /> 
     <xsl:variable name="AttrName" select="@NAME" /> 
     <xsl:variable name="SrcValue" select="document('source.xml')//NODELINE[@CLASS=$NodeLine]//ATTR_NODE[@NAME=$AttrName]/@VALUE" /> 
     <xsl:variable name="TgtValue" select="document('target.xml')//NODELINE[@CLASS=$NodeLine]//ATTR_NODE[@NAME=$AttrName]/@VALUE" /> 
     <xsl:element name="ATTR_NODE"> 
      <xsl:attribute name="NAME"> 
       <xsl:value-of select="$AttrName"/> 
      </xsl:attribute> 
      <xsl:attribute name="SRCVALUE"> 
       <xsl:value-of select="$SrcValue" /> 
      </xsl:attribute> 
      <xsl:attribute name="TGTVALUE"> 
       <xsl:value-of select="$TgtValue" /> 
      </xsl:attribute> 
      <xsl:attribute name="ISDIFF"> 
       <xsl:value-of select="$SrcValue!=$TgtValue" /> 
      </xsl:attribute> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

身份模板用於遍歷和複製propNode,具有特殊處理每個ATTR_NODE檢查源和目標中的VALUE,然後評估其是否相等。我假設NODE_LINE/@CLASS足以確定NODE_LINE的身份 - 如果不是,那麼您需要添加其他檢查功能,例如, @TYPE

xslt針對propnode.xml運行,並且source.xmltarget.xml必須存在於相同的文件夾中。

輸出

<?xml version="1.0" encoding="utf-8"?> 
<NODES> 
    <NODE> 
     <NODELINE CLASS="Item" TYPE="Item"> 
      <ATTR_NODES> 
       <ATTR_NODE NAME="myName" SRCVALUE="myNameValue" TGTVALUE="myNameValue" ISDIFF="false" /> 
       <ATTR_NODE NAME="myDesc" SRCVALUE="test-myDescValue" TGTVALUE="myDescValue" ISDIFF="true" />" 
      </ATTR_NODES> 
     </NODELINE> 
     <NODELINE CLASS="Item1" TYPE="Item1"> 
      <ATTR_NODES> 
       <ATTR_NODE NAME="myName1" SRCVALUE="myNameValue1" TGTVALUE="myNameValue1" ISDIFF="false" /> 
       <ATTR_NODE NAME="myDesc1" SRCVALUE="myDescValue1" TGTVALUE="myDescValue1" ISDIFF="false" /> 
      </ATTR_NODES> 
     </NODELINE> 
     <NODELINE CLASS="Item2" TYPE="Item2"> 
      <ATTR_NODES> 
       <ATTR_NODE NAME="myName2" SRCVALUE="test-myNameValue2" TGTVALUE="myNameValue2" ISDIFF="true" /> 
       <ATTR_NODE NAME="myDesc2" SRCVALUE="myDescValue2" TGTVALUE="myDescValue2" ISDIFF="false" /> 
      </ATTR_NODES> 
     </NODELINE> 
    </NODE> 
</NODES>