0

XPathまたはXSLTであなたの助けが必要です。

私はどちらも初めてですが、今は最初は単純に思えるケースを解決する必要がありますが、何度も試した後、解決するのは難しいです:)

次の(簡略化された)XMLがあります。

まず、「きれいな」もの:

<root>
    <a>
        <a1>
            <a11>
                <x1>111</x1>
                <x2>222</x2>
                <x3>333</x3>
            </a11>
        </a1>
    </a> 
    <b>
        <b1>
            <b11>
                <b111>
                    <x2>777</x2>
                    <x3>888</x3>
                </b111>
            </b11>
        </b1>
    </b>
</root>

2 つ目は同じ XML ですが、「論理ID 番号が追加されています。これらの ID は後で結果をクロスチェックするのに役立ちますが、XML には物理的に存在しません。

<root>
1    <a>
    1    <a1>
        1    <a11>
            1    <x1>111</x1>
            2    <x2>222</x2>
            3    <x3>333</x3>
            </a11>
        </a1>
    </a> 
2    <b>
    1    <b1>
        1    <b11>
            1    <b111>
                1    <x2>777</x2>
                2    <x3>888</x3>
                </b111>
            </b11>
        </b1>
    </b>
</root>

私の目標は、現在のノードの論理 ID 番号とそのすべての親、祖父母など (「ルート」ノードを除く) を現在のノードから順番に取得することです。

たとえば、現在のノード位置が の場合、次のroot/a/a1/a11/x2ような出力を生成したいと考えています。

出力: 2.1.1.1

ここで (順番に、左から右へ):

'2' = 'x2' node
'1' = 'a11' node
'1' = 'a1' node
'1' = 'a' node

現在、私が知っているのは、これらの XPath を使用して、現在のノード ID 番号を取得することだけです。これは 1 レベル上の親のみです。

count(./preceding-sibling::*) + 1   
count(../preceding-sibling::*) + 1

しかし、親の ID 番号の残りの部分 (ある場合) を取得する方法がまだわかりません。XML のノードの深さのレベルはさまざまであり、ほとんどの場合、2 レベル以上の深さであるため、その可能性についても説明する必要があります。

私の質問が明確であることを願っています。

誰か解決策を教えてください。あなたの解決策についても説明していただければ、私のような初心者にとっても非常に役立ちます:)

ありがとうございました。

4

1 に答える 1

0

軸を使用して、ancestor-or-self次のようにノードのすべての祖先を列挙できます。

<xsl:for-each select="ancestor-or-self::*[position() &lt; last()]">
    <xsl:sort select="position()" data-type="number" order="descending"/>
    <xsl:value-of select="count(preceding-sibling::*) + 1"/>
    <xsl:if test="position() != last()">.</xsl:if>
</xsl:for-each>

ノードの場合root/a/a1/a11/x2、これは出力します2.1.1.1

述語[position() &lt; last()]は、ルート要素を除外するために使用されます。xsl:sort祖先をドキュメントの逆順で処理するために使用されます。

于 2013-10-07T21:20:55.437 に答える