2013-04-05 66 views
0

我有這樣XSLT轉換屬性,元素和從其他的Elemen複製值

<ABC version="1.0"> 
    <XYZ> 
    <ROWSET ROWS="00001"> 
     <ROWDEF> 
     <COLUMN ID="ACCT_ID" LEN="016" NULL="Y"/> 
     <COLUMN ID="AGNT_ID" LEN="004" NULL="Y"/> 
     <COLUMN ID="CUST_EXTR_ID" LEN="024" NULL="Y"/> 
     <COLUMN ID="PI_ID" LEN="019" NULL="Y"/> 
     <COLUMN ID="PRIN_ID" LEN="004" NULL="Y"/> 
     <COLUMN ID="SYS_ID" LEN="004" NULL="Y"/> 
     </ROWDEF> 
     <ROW> 
     <C>6369921501000060</C> 
     <C>0000</C> 
     <C>C13093102141063422034238</C> 
     <C>6369921501000060 </C> 
     <C>1500</C> 
     <C>9008</C> 
     </ROW> 
     <ROW> 
     <C>6369921501000061</C> 
     <C>0001</C> 
     <C>C13093102141063422034231</C> 
     <C>6369921501000060 </C> 
     <C>1501</C> 
     <C>9001</C> 
     </ROW> 
    </ROWSET> 
    </XYZ> 
</ABC> 

XML數據和我想這個轉換成

<?xml version="1.0" encoding="utf-8"?> 
<ABC version="1.0"> 
    <XYZ RC="0067"> 
    <ROWSET ROWS="00001"> 
     <ROWDEF> 
     <ACCT_ID>6369921501000060</ACCT_ID> 
     <AGNT_ID>0000</AGNT_ID> 
     <CUST_EXTR_ID>C13093102141063422034238</CUST_EXTR_ID> 
     <PI_ID>6369921501000060</PI_ID> 
     <PRIN_ID>1500</PRIN_ID> 
     <SYS_ID>9008</SYS_ID> 
     </ROWDEF> 
     <ROWDEF> 
     <ACCT_ID>6369921501000061</ACCT_ID> 
     <AGNT_ID>0001</AGNT_ID> 
     <CUST_EXTR_ID>C13093102141063422034231</CUST_EXTR_ID> 
     <PI_ID>6369921501000060</PI_ID> 
     <PRIN_ID>1501</PRIN_ID> 
     <SYS_ID>9001</SYS_ID> 
     </ROWDEF> 
    </ROWSET> 
    </XYZ> 
</ABC> 

我已經環顧四周,並試圖幾件事情,但它不工作。 有人可以幫助我。 下面是我的XSLT。提前致謝。

<?xml version="1.0" encoding="utf-8"?> 

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

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

    <xsl:template match="COLUMN"> 
    <xsl:element name="{@ID}"> 
     <xsl:copy> 
     <xsl:apply-templates select="node()"></xsl:apply-templates> 
     </xsl:copy> 
     <xsl:apply-templates /> 
     <!--<xsl:call-template name="value"></xsl:call-template>--> 
    </xsl:element> 
    </xsl:template> 

    <!-- 
    <xsl:template match="ROW" name="value"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()"></xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 
    --> 

</xsl:stylesheet> 
+0

哪裏RC = 「0067」 在你的輸出文件的值是從哪裏來的?不要看到它在輸入文件 – 2013-04-05 17:31:28

+0

@AdolfoPerez很抱歉。我忘了提及這是無關緊要的。我忘了將它從樣品中取出。謝謝你的幫助。 – JohnXsl 2013-04-05 18:22:39

回答

2

此樣式表將主要做你想做的事情,但我無法理解如何生成<XYZ RC="0067">的屬性。

對於它遇到它在一個變量中保存ROWDEF元件每個ROWSET,複製所有屬性節點,然後處理每個ROW元件。在ROW中的每個C元素的位置被封存,並且在所存儲的ROWDEF元素內的相應位置中的COLUMN被用於從ID屬性中獲取元素名稱。

<?xml version="1.0" encoding="utf-8"?> 

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="ROWSET"> 

    <xsl:variable name="columns" select="ROWDEF/COLUMN"/> 

    <xsl:copy> 

     <xsl:apply-templates select="@*" /> 

     <xsl:for-each select="ROW"> 
     <ROWDEF> 
      <xsl:for-each select="C"> 
      <xsl:variable name="pos" select="position()"/> 
      <xsl:element name="{$columns[$pos]/@ID}"> 
       <xsl:value-of select="."/> 
      </xsl:element> 
      </xsl:for-each> 
     </ROWDEF> 
     </xsl:for-each> 

    </xsl:copy> 

    </xsl:template> 

</xsl:stylesheet> 

輸出

<?xml version="1.0" encoding="utf-8"?> 
<ABC version="1.0"> 
    <XYZ> 
     <ROWSET ROWS="00001"> 
     <ROWDEF> 
      <ACCT_ID>6369921501000060</ACCT_ID> 
      <AGNT_ID>0000</AGNT_ID> 
      <CUST_EXTR_ID>C13093102141063422034238</CUST_EXTR_ID> 
      <PI_ID>6369921501000060 </PI_ID> 
      <PRIN_ID>1500</PRIN_ID> 
      <SYS_ID>9008</SYS_ID> 
     </ROWDEF> 
     <ROWDEF> 
      <ACCT_ID>6369921501000061</ACCT_ID> 
      <AGNT_ID>0001</AGNT_ID> 
      <CUST_EXTR_ID>C13093102141063422034231</CUST_EXTR_ID> 
      <PI_ID>6369921501000060 </PI_ID> 
      <PRIN_ID>1501</PRIN_ID> 
      <SYS_ID>9001</SYS_ID> 
     </ROWDEF> 
     </ROWSET> 
    </XYZ> 
</ABC> 
+0

xcellent!謝謝。這很好。 – JohnXsl 2013-04-05 18:00:06

相關問題