0

我有这样的 XML 数据

<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 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>
4

1 回答 1

2

该样式表将主要执行您想要的操作,但我无法理解如何为<XYZ RC="0067">.

对于ROWSET遇到的每一个元素,它都将ROWDEF元素保存在一个变量中,复制所有属性节点,然后处理每个ROW元素。计算每个C元素在 中的位置ROW,并且COLUMN在存储的元素中的相应位置中的用于从属性ROWDEF中获取元素名称。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>
于 2013-04-05T17:45:01.237 回答