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 に答える