これは私のソース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の子ではないため、もちろん機能していません。
事前にヒントをありがとう!
Data
の後のスラッシュを削除し、ルートを追加します。
<xsl:variable name="myVarA" select="/root/DataSet/Data[@Value1='2']/@Value2"/>
Xpathには2つの問題があります-最初にphihagのようなData
の後に子セレクターを削除する必要があります。また、xpathにroot
を含めるのを忘れました。あなたがしたいことは次のとおりです。
select="/root/DataSet/Data[@Value1='2']/@Value2"
注:xpathの先頭で//を使用すると、CPUを集中的に使用します。一致するすべてのノードを検索します。/root/DataSetなどのより具体的なパスを使用すると、より高速なクエリが作成されます。
これを試して
xsl:variable name="myVarA" select="//DataSet/Data[@Value1='2']/@Value2" />
'//'は任意の深さでDataSetを検索します
Value1に適切な値を持つノードを指す変数を作成し、tを参照することでそれを行います。
<xsl:variable name="myVarANode" select="root//DataSet/Data[@Value1='2']" />
<xsl:value-of select="$myVarANode/@Value2"/>
他のみんなの答えも正しいです-実際には、XPATHの混乱を招く余分なスラッシュに気付かなかったので、もっと正しいです。それでも、これも機能し、さまざまなもので機能する可能性があるため、このメソッドをツールボックスに保持します。