0

入力:

XMLを入力してください

<Root>
    <Number>1</Number>
    <Reference>100</Reference>

    <Number>2</Number>
    <Reference>101</Reference>

    <Number>3</Number>
    <Reference>100</Reference>

    <Number>4</Number>
    <Reference>102</Reference>

    <Number>5</Number>
    <Reference>100</Reference>
</Root>

期待される出力:

<Root>
    <Number>1</Number>
    <Reference>100</Reference>
    <RefNumber>1</RefNumber>

    <Number>2</Number>
    <Reference>101</Reference>
    <RefNumber>1</RefNumber>

    <Number>3</Number>
    <Reference>100</Reference>
    <RefNumber>2</RefNumber>

    <Number>4</Number>
    <Reference>102</Reference>
    <RefNumber>1</RefNumber>

    <Number>5</Number>
    <Reference>100</Reference>
    <RefNumber>3</RefNumber>
</Root>

ルート/参照に基づいてグループ化し、xslt 1.0の出力でRefNumberに連番を追加するにはどうすればよいですか?

前もって感謝します

4

1 に答える 1

3

これを行う 1 つの方法は、xsl:numberを使用することです。Reference要素と一致する場合は常に、その要素をコピーし、同じ値を持つ Reference 要素の数を持つRefNumber要素を追加します。

<xsl:template match="Reference">
    <xsl:copy-of select="." />
    <xsl:variable name="Ref" select="." />
    <RefNumber><xsl:number count="Reference[. = $Ref]" /></RefNumber>
</xsl:template>

ここに完全な XSLT があります

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

    <xsl:template match="Reference">
        <xsl:copy-of select="." />
        <xsl:variable name="Ref" select="." />
        <RefNumber><xsl:number count="Reference[. = $Ref]" /></RefNumber>
    </xsl:template>

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

サンプル XML に適用すると、次のように出力されます。

<Root>
    <Number>1</Number>
    <Reference>100</Reference>
    <RefNumber>1</RefNumber>

    <Number>2</Number>
    <Reference>101</Reference>
    <RefNumber>1</RefNumber>

    <Number>3</Number>
    <Reference>100</Reference>
    <RefNumber>2</RefNumber>

    <Number>4</Number>
    <Reference>102</Reference>
    <RefNumber>1</RefNumber>

    <Number>5</Number>
    <Reference>100</Reference>
    <RefNumber>3</RefNumber>
</Root>

ID 変換テンプレートを使用して他の既存のノードをコピーすることに注意してください。

于 2012-09-10T15:22:29.340 に答える