0

次のような XML ドキュメントがあります。

(p は以前に定義されています)

<p:Players>
<p:Player>
<p:Name>David</p:Name>
<p:Club>
<p:Name>Madrid</p:Name>
</p:Club>
<p:PreviousClubs>
<p:Club><p:Name>Milan</p:Name></p:Club>
<p:Club><p:Name>Manchester</p:Name></p:Club>
</p:PreviousClubs>
</p:Player>
<p:Player>
<p:Name>Alex</p:Name>
<p:Club>
<p:Name>Madrid</p:Name>
</p:Club>
<p:PreviousClubs>
<p:Club><p:Name>Birmingham</p:Name></p:Club>
<p:Club><p:Name>Manchester</p:Name></p:Club>
</p:PreviousClubs>
</p:Player>
<p:Player>
<p:Name>Fred</p:Name>
<p:Club>
<p:Name>Madrid</p:Name>
</p:Club>
<p:PreviousClubs>
<p:Club><p:Name>Milan</p:Name></p:Club>
<p:Club><p:Name>Birmingham</p:Name></p:Club>
</p:PreviousClubs>
</p:Player>
</p:Players>

以前に特定のクラブでプレーしたことのあるすべてのプレーヤーの名前を取得したいと思います。

これは私がこれまでに持っているものですが、何も拾っていません:

/*[1]/p:Player[p:PreviousClubs/p:Club/p:Name='Manchester']/p:Name/text()

私はそれが戻ることを期待しています

David
Alex

しかし、私は何も得ません

誰かが私が間違っているところを見ることができますか?

名前空間と p: のプレフィックスは正しいです - 他の場所で使用されていて、それで問題ありません。特定の親ノードの選択に関する私の論理が間違っていると感じています...

BizTalk 駆動型の XSLT 1.0 に固執する必要があります。

4

1 に答える 1

1

これはほぼ確実に名前空間の問題です。

XML で名前空間プレフィックスを使用していますが、対応する名前空間の定義がありません。ルート要素にこのような定義が必要です

<p:Players xmlns:p="mynamespace">

次に、XSLT 内で、同じ名前空間 URI が定義されていることも確認する必要があります。

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

プレフィックスpは同じである必要はないことに注意してください。ここで重要な識別子は名前空間 URI です。URI が XML の内容と一致しない場合、プレフィックスを使用すると要素が見つかりません。

したがって、この XSLT を使用すると、期待どおりにDavidAlexが返されるはずです (ただし、ここで改行が必要な場合は、コードを追加する必要があります)。

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

    <xsl:template match="/">
       <xsl:apply-templates 
           select="/*[1]/p:Player[p:PreviousClubs/p:Club/p:Name='Manchester']/p:Name/text()" />
    </xsl:template>
</xsl:stylesheet>

これはすべて、元の XPath 式が正しいことを意味します。ただし、最初は必要ないので、少し単純化できます[1]。最初/の要素はドキュメント要素に一致するため/*、ルート要素にも一致します。整形式の XML ではルート要素を 1 つしか持てないため、インデックスで修飾する必要はありません。[1]

/*/p:Player[p:PreviousClubs/p:Club/p:Name='Manchester']/p:Name/text()

text()この場合、ビルトイン テンプレートが要素のテキストを出力するため、最後に をドロップすることもできます。

于 2012-11-09T09:26:14.620 に答える