2012-01-13 7 views
2

ノードセット内の別個のノード(属性値に基づく)についてもう一度説明します。XSLTノードセットの異なる値

<struct> 
    <a> 
    <x id="1">a_1</x> 
    <x id="2">a_2</x> 
    <x id="3">a_3</x> 
    </a> 
    <b inherits="a"> 
    <x id="2">b_2</x> 
    </b> 
</struct> 

<struct/>は同じ<a/>を継承<b/>のような複数の要素を含んでいてもよい: は、uは次のような構造を持っている想像してみてください。同時に、<a/>のような複数の要素が許可されます。 <a/>sおよび<b/>sの順序は任意である。継承は、単一レベルの深さです。

質問:与えられた<b/>ため、次のノードセットを選択単一 XPathを作成する方法:

<x id="1">a_1</x> 
<x id="2">b_2</x> 
<x id="3">a_3</x> 

が2行目b_2値に注意してください。

これに対する解決策はありますか?

更新:

resutingのXPathは次の形式有するべきである:b[(magic_xpath)[@id=2]='b_2']magic_xpath<a/><b/> sおよびSから別個<x/> Sを選択します。

<struct> 
    <a> 
    <x id="1">a_1</x> 
    <x id="2">a_2</x> 
    <x id="3">a_3</x> 
    </a> 
    <b inherits="a"> 
    <x id="2">I don't match resulting XPath</x> 
    </b> 
    <b inherits="a"> 
    <x id="2">b_2</x> 
    </b> 
</struct> 
+0

更新の意味が明らかではありません。何が結果でなければならないのでしょうか?また、あなたのアップデートのすべての 'x'要素が既に別個の値を持っているときに、「別個の' 」が必要なのはなぜですか? –

答えて

1

使用

$vBb要素であると定義されて
$vB/x 
| 
    /*/*[name() = $vB/@inherits] 
       /x[not(@id = $vB/x/@id)] 

実生活<struct/>は次のように見ることができます。

これは名前b/@inheritsの値であるstruct/*要素(structの子供)の(任意のと同じではありませんid属性b/x/@id属性を持つ)すべてb/x要素とすべてのx子供たちの労働組合を選択します。

か、コメントにOPによって要求されるように - 変数なし:

/*/b/x 
| 
    /*/*[name() = /*/b/@inherits] 
       /x[not(@id = /*/b/x/@id)] 

完全なXSLTベースの検証

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

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "/*/b/x 
    | 
     /*/*[name() = /*/b/@inherits] 
        /x[not(@id = /*/b/x/@id)] 

    "/> 
</xsl:template> 
</xsl:stylesheet> 

この変換が提供に適用され(整形式に修正)XML文書

<struct> 
    <a> 
     <x id="1">a_1</x> 
     <x id="2">a_2</x> 
     <x id="3">a_3</x> 
    </a> 
    <b inherits="a"> 
     <x id="2">b_2</x> 
    </b> 
</struct> 

単一のXPath式を評価し、選択されたノードは、出力されている。

<x id="1">a_1</x> 
<x id="3">a_3</x> 
<x id="2">b_2</x> 
+0

このような素早い回答をありがとうございます!しかし、変数を宣言しなくても同じことをすることは可能でしょうか? –

+0

はい、 '$ vB'を'/*/b'に置き換えます。 –

+0

@Savva Mikhalevski:私はXPath式を使って答えを編集しました。変数。 –

関連する問題