-2

私はxsltを初めて使用し、キーとテンプレートを使用してグループ化を学習する方法を学ぼうとしています。

誰かがxsltで次のことを行う方法について私を助けてもらえますか?変換を行うには、別のテンプレートからテンプレートを呼び出す必要があります。

ありがとう

これが私のxmlです。

<Doc>
<ExOrder>121</ExOrder>
<Line>
    <Ordernumber>225</Ordernumber>
    <OrderID>1</OrderID>
    <Quantity>5</Quantity>
</Line>
<Line>
    <Ordernumber>225</Ordernumber>
    <OrderID>5</OrderID>
    <Quantity>5</Quantity>
</Line>
<Line>
    <Ordernumber>226</Ordernumber>
    <OrderID>2</OrderID>
    <Quantity>5</Quantity>
</Line>

そして、これがその後の様子です。

<Doc>
    <Order>
        <Ordernumber>225</Ordernumber>
        <Line>
            <ID>1</ID>
            <ID>5</ID>
        </Line>
    </Order>
    <Order>
        <Ordernumber>225</Ordernumber>
        <Line>
            <ID>1</ID>
            <ID>5</ID>
        </Line>
    </Order>
</Doc>
4

1 に答える 1

0

実際に必要な出力は次のとおりです。

<Doc>
  <Order>
    <Ordernumber>225</Ordernumber>
    <Line>
      <ID>1</ID>
      <ID>5</ID>
    </Line>
  </Order>
  <Order>
    <Ordernumber>226</Ordernumber>
    <Line>
      <ID>2</ID>
    </Line>
  </Order>
</Doc>

あなたが提供したサンプル出力は意味がないので。このXSLTは、サンプル入力で実行すると上記の出力を生成します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:key name="kOrder" match="Line" use="Ordernumber"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/*">
    <Doc>
      <xsl:apply-templates select="Line[generate-id() = 
                                        generate-id(key('kOrder', Ordernumber)[1])]" />
    </Doc>
  </xsl:template>

  <xsl:template match="Line">
    <Order>
      <xsl:apply-templates select="Ordernumber" />
      <Line>
        <xsl:apply-templates select="key('kOrder', Ordernumber)/OrderID" />
      </Line>
    </Order>
  </xsl:template>

  <xsl:template match="OrderID">
    <ID>
      <xsl:value-of select="."/>
    </ID>
  </xsl:template>
</xsl:stylesheet>
于 2013-02-28T11:31:01.047 に答える