1

次の XML があります。

<funds>
<bags>
    <bag name="BAG_USD_MAIN" value="10.0" type="USD">
        <pockets>
            <pocket name="bank" value="7.5" expireDate="20130331" />
            <pocket name="award" value="2.5" expireDate="20150501" />
        </pockets>
     </bag>
    <bag name="BAG_USD_SAVINGS" value="290.75" type="USD">
        <pockets>
            <pocket name="bank" value="290.75" expireDate="20130331" />
        </pockets>
     </bag>
    <bag name="BAG_EUR_EXTRA" value="890.0" type="EUR">
        <pockets>
            <pocket name="bank" value="753.0" expireDate="20131231" />
            <pocket name="bank_eng" value="137.0" expireDate="20150501" />
        </pockets>
     </bag>
</bags>
</funds>

XSLT を使用して XML 結果リストを取得したいと思います。

<bags>
    <bag name="BAG_USD_MAIN" maxExpDate="20150501" />
    <bag name="BAG_USD_SAVINGS" maxExpDate="20130331" />
    <bag name="BAG_EUR_EXTRA" maxExpDate="20150501" />
</bags>

つまり、「バッグ」をグループ化し、それぞれの最大 expireDate を表示します。

それは XSLT 2.0 で実現できますか? どのように?

ありがとうございました

4

1 に答える 1

1

入力 XML は無効です (すべてのpocket要素が閉じられていません) が、それが修正されていると仮定すると、XSLT 1.0 でこれを行うことができます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="bags">
    <xsl:copy>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="bag">
    <bag name="{@name}">
      <xsl:apply-templates select="pockets/pocket/@expireDate">
        <xsl:sort select="." data-type="number" />
      </xsl:apply-templates>
    </bag>
  </xsl:template>

  <xsl:template match="@expireDate">
    <xsl:attribute name="maxExpDate">
      <xsl:value-of select="." />
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

これを入力 XML に対して実行すると (有効にした後)、結果は次のようになります。

<bags>
  <bag name="BAG_USD_MAIN" maxExpDate="20150501" />
  <bag name="BAG_USD_SAVINGS" maxExpDate="20130331" />
  <bag name="BAG_EUR_EXTRA" maxExpDate="20131231" />
</bags>
于 2013-03-08T19:01:53.307 に答える