XSLT转换属性,元素和从其他的Elemen复制值

问题描述:

我有这样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

此样式表将主要做你想做的事情,但我无法理解如何生成<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