2009-07-01 39 views
30

これは簡単な質問ですが、わかりません。 次の簡単なXMLドキュメント考えてみましょう:XPathの選択から特定の要素を除外する

<root> 
    <a></a> 
    <b></b> 
    <c></c> 
    <a></a> 
    <d></d> 
    <e></e> 
    <a></a> 
    <a></a> 
</root> 

をXPathを使用して<e>を通じてノード<b>を選択するための最良の方法は何ですか?

私は

+5

複数の要素を除外するにはどうすればよいですか? – lwpro2

+0

これはまた複数の要素を除外するようにも働くはずです[abcまたはdefでない] – novice

答えて

50
/root/*[not(self::a)] 
+0

これはXPointerとXIncludeを使用する場合にも機能します。 –

-2

は、あなたが試している(トリックを行いません)

/root/*[not(a)] 

ような何かを探しています:

/ルート/ B | /ルート/ C |ルート/ d |/root/e

+4

私は、select = "* [not(self :: abc)] [not(self :: def)それが私がそれを実装した方法です。残念ながら、不明な名前を持つ他のノードがある可能性があります。 – user123444555621

6

これは古い質問ですが、私は最近同様の問題に遭遇し、次のxpathを使用しましたそれを解決するために:

/root/*[not(name()='a')] 
7

は、XPath 2.0でそれを追加するために答え、あなたがexceptを使用することができます。

/root/(* except a) 

のXPath 1.0の場合は、Tomalakは指摘し、これはそれを行うための標準的な方法は次のとおりです。

/root/*[not(self::a)] 

ところで、xsl:template/@match属性のXSLT 2.0でこれを使用しようとする人がここに着くと、@matchのようなXPath式は、ではなく、のXPath式です。この場合、XPath 1.0のソリューションが有効です。

関連する問題