1

次の XML を変換する XSLT でループを作成したいと思います。

<PAYMENTS>
    <PAYMENT_BATCH_ID>987654321</PAYMENT_BATCH_ID>
    <PAYMENT_NUMBER1_AMOUNT>123456789</PAYMENT_NUMBER1_AMOUNT>
    <PAYMENT_NUMBER1_CURRENCY>EUR</PAYMENT_NUMBER1_CURRENCY>
    <PAYMENT_NUMBER1_DATE>19700101</PAYMENT_NUMBER1_DATE>
    <PAYMENT_STRING1_DESCRIPTION>Description</PAYMENT_STRING1_DESCRIPTION>
    <PAYMENT_NUMBER2_AMOUNT>123456789</PAYMENT_NUMBER2_AMOUNT>
    <PAYMENT_NUMBER2_CURRENCY>GBP</PAYMENT_NUMBER2_CURRENCY>
    <PAYMENT_NUMBER2_DATE>19700101</PAYMENT_NUMBER2_DATE>
    <PAYMENT_STRING2_DESCRIPTION>Description</PAYMENT_STRING2_DESCRIPTION>
    <PAYMENT_NUMBERn_AMOUNT>123456789</PAYMENT_NUMBERn_AMOUNT>
    <PAYMENT_NUMBERn_CURRENCY>CHF</PAYMENT_NUMBERn_CURRENCY>
    <PAYMENT_NUMBERn_DATE>19700101</PAYMENT_NUMBERn_DATE>
    <PAYMENT_STRINGn_DESCRIPTION>Description</PAYMENT_STRINGn_DESCRIPTION>
</PAYMENTS>

この XML に:

<PAYMENTS>
    <PAYMENT>
        <CURRENCY>EUR</CURRENCY>
        <AMOUNT>123456789</AMOUNT>
        <DATE>19700101</DATE>
    </PAYMENT>
    <PAYMENT>
        <CURRENCY>GBP</CURRENCY>
        <AMOUNT>123456789</AMOUNT>
        <DATE>19700101</DATE>
    </PAYMENT>
    <PAYMENT>
        <CURRENCY>CHF</CURRENCY>
        <AMOUNT>123456789</AMOUNT>
        <DATE>19700101</DATE>
    </PAYMENT>
</PAYMENTS>

n は任意の数にできるため、任意の回数の支払いが可能であることに注意してください。XSLT 2.0 を使用しています。

要素名の数値を反復する方法を見つけることができませんでした。助けてください?

乾杯、

トゥーノ

4

1 に答える 1

4

スタイルシート

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

<xsl:output indent="yes"/>

<xsl:template match="PAYMENTS">
  <xsl:copy>
    <xsl:for-each-group select="*" group-by="replace(local-name(), '\D+', '')">
      <PAYMENT>
        <xsl:apply-templates select="current-group()"/>
      </PAYMENT>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

<xsl:template match="PAYMENTS/*">
  <xsl:element name="{substring-after(substring-after(local-name(), '_'), '_')}">
   <xsl:value-of select="."/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

変形する

<PAYMENTS>
    <PAYMENT_NUMBER1_CURRENCY>EUR</PAYMENT_NUMBER1_CURRENCY>
    <PAYMENT_NUMBER1_AMOUNT>123456789</PAYMENT_NUMBER1_AMOUNT>
    <PAYMENT_NUMBER1_DATE>19700101</PAYMENT_NUMBER1_DATE>
    <PAYMENT_NUMBER2_CURRENCY>GBP</PAYMENT_NUMBER2_CURRENCY>
    <PAYMENT_NUMBER2_AMOUNT>123456789</PAYMENT_NUMBER2_AMOUNT>
    <PAYMENT_NUMBER2_DATE>19700101</PAYMENT_NUMBER2_DATE>
    <PAYMENT_NUMBERn_CURRENCY>CHF</PAYMENT_NUMBERn_CURRENCY>
    <PAYMENT_NUMBERn_AMOUNT>123456789</PAYMENT_NUMBERn_AMOUNT>
    <PAYMENT_NUMBERn_DATE>19700101</PAYMENT_NUMBERn_DATE>
</PAYMENTS>

の中へ

<PAYMENTS>
   <PAYMENT>
      <CURRENCY>EUR</CURRENCY>
      <AMOUNT>123456789</AMOUNT>
      <DATE>19700101</DATE>
   </PAYMENT>
   <PAYMENT>
      <CURRENCY>GBP</CURRENCY>
      <AMOUNT>123456789</AMOUNT>
      <DATE>19700101</DATE>
   </PAYMENT>
   <PAYMENT>
      <CURRENCY>CHF</CURRENCY>
      <AMOUNT>123456789</AMOUNT>
      <DATE>19700101</DATE>
   </PAYMENT>
</PAYMENTS>

すべての要素が必要ではなく、出力内の要素の順序を変更したい場合は、それらを明示的にリストする必要があります。

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

<xsl:output indent="yes"/>

<xsl:template match="PAYMENTS">
  <xsl:copy>
    <xsl:for-each-group select="* except PAYMENT_BATCH_ID" group-by="replace(local-name(), '\D+', '')">
      <PAYMENT>
        <xsl:apply-templates select="current-group()[self::*[contains(local-name(), 'CURRENCY')]],
                                     current-group()[self::*[contains(local-name(), 'AMOUNT')]],
                                     current-group()[self::*[contains(local-name(), 'DATE')]]"/>
      </PAYMENT>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

<xsl:template match="PAYMENTS/*">
  <xsl:element name="{substring-after(substring-after(local-name(), '_'), '_')}">
   <xsl:value-of select="."/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

そのスタイルシートと入力で

<PAYMENTS>
    <PAYMENT_BATCH_ID>987654321</PAYMENT_BATCH_ID>
    <PAYMENT_NUMBER1_AMOUNT>123456789</PAYMENT_NUMBER1_AMOUNT>
    <PAYMENT_NUMBER1_CURRENCY>EUR</PAYMENT_NUMBER1_CURRENCY>
    <PAYMENT_NUMBER1_DATE>19700101</PAYMENT_NUMBER1_DATE>
    <PAYMENT_STRING1_DESCRIPTION>Description</PAYMENT_STRING1_DESCRIPTION>
    <PAYMENT_NUMBER2_AMOUNT>123456789</PAYMENT_NUMBER2_AMOUNT>
    <PAYMENT_NUMBER2_CURRENCY>GBP</PAYMENT_NUMBER2_CURRENCY>
    <PAYMENT_NUMBER2_DATE>19700101</PAYMENT_NUMBER2_DATE>
    <PAYMENT_STRING2_DESCRIPTION>Description</PAYMENT_STRING2_DESCRIPTION>
    <PAYMENT_NUMBERn_AMOUNT>123456789</PAYMENT_NUMBERn_AMOUNT>
    <PAYMENT_NUMBERn_CURRENCY>CHF</PAYMENT_NUMBERn_CURRENCY>
    <PAYMENT_NUMBERn_DATE>19700101</PAYMENT_NUMBERn_DATE>
    <PAYMENT_STRINGn_DESCRIPTION>Description</PAYMENT_STRINGn_DESCRIPTION>
</PAYMENTS>

サクソン 9.5 出力

<PAYMENTS>
   <PAYMENT>
      <CURRENCY>EUR</CURRENCY>
      <AMOUNT>123456789</AMOUNT>
      <DATE>19700101</DATE>
   </PAYMENT>
   <PAYMENT>
      <CURRENCY>GBP</CURRENCY>
      <AMOUNT>123456789</AMOUNT>
      <DATE>19700101</DATE>
   </PAYMENT>
   <PAYMENT>
      <CURRENCY>CHF</CURRENCY>
      <AMOUNT>123456789</AMOUNT>
      <DATE>19700101</DATE>
   </PAYMENT>
</PAYMENTS>
于 2013-08-16T11:54:17.077 に答える