web-dev-qa-db-ja.com

XSLT-属性ごとにXML属性を選択する方法

これは私のソースxmlの構造です:

<root>
<DataSet Value="A">
<Data Value1="1" Value2="anythingA1" />
<Data Value1="2" Value2="anythingA2" />
<Data Value1="3" Value2="anythingA3" />
<Data Value1="4" Value2="anythingA4" />
<Data Value1="5" Value2="anythingA5" />
</DataSet>
</root>

そこからいくつかの変数を作成したいValue1 = "2"のすべてとValue1 = "5"のすべてから、myVar1がanyA2で、myVar2がanyA5になるはずです。

私のアプローチはこんな感じ

<xsl:variable name="myVarA" select="/DataSet/Data/[@Value1='2']/@Value2" />

ただし、Value2はValue1の子ではないため、もちろん機能していません。

事前にヒントをありがとう!

25
seansilver

Dataの後のスラッシュを削除し、ルートを追加します。

<xsl:variable name="myVarA" select="/root/DataSet/Data[@Value1='2']/@Value2"/>
47
phihag

Xpathには2つの問題があります-最初にphihagのようなDataの後に子セレクターを削除する必要があります。また、xpathにrootを含めるのを忘れました。あなたがしたいことは次のとおりです。

select="/root/DataSet/Data[@Value1='2']/@Value2"
4
Andrew Hare

注:xpathの先頭で//を使用すると、CPUを集中的に使用します。一致するすべてのノードを検索します。/root/DataSetなどのより具体的なパスを使用すると、より高速なクエリが作成されます。

1
pixel

これを試して

xsl:variable name="myVarA" select="//DataSet/Data[@Value1='2']/@Value2" />

'//'は任意の深さでDataSetを検索します

1
paul

Value1に適切な値を持つノードを指す変数を作成し、tを参照することでそれを行います。

<xsl:variable name="myVarANode" select="root//DataSet/Data[@Value1='2']" />
<xsl:value-of select="$myVarANode/@Value2"/>

他のみんなの答えも正しいです-実際には、XPATHの混乱を招く余分なスラッシュに気付かなかったので、もっと正しいです。それでも、これも機能し、さまざまなもので機能する可能性があるため、このメソッドをツールボックスに保持します。

0