xpathはノードが存在するかどうかを見つける


201

xpathクエリを使用して、ノード(タグ)が存在するかどうかをどのように確認しますか?

たとえば、ウェブサイトのページが/ html / bodyや/ html / head / titleのような正しい基本構造を持っていることを確認する必要がある場合


たぶん、必須要素を示すXMLスキーマを使用する方が良いでしょうか?したがって、ドキュメントがそれを使用しているかどうかを確認してください。
abatishchev 2009

回答:


321
<xsl:if test="xpath-expression">...</xsl:if>

だから例えば

<xsl:if test="/html/body">body node exists</xsl:if>
<xsl:if test="not(/html/body)">body node missing</xsl:if>

41
質問がXSLTの使用をまったく指定していないことを考えると、非常に高い評価に驚いています。
tjmoore

これは素晴らしいですが、存在するか空かを確認したい場合はどうすればよいですか?
SearchForKnowledge

3
@SearchForKnowledgeは、SOでの新しい質問として、しかしクイックガイドとしてhtml/body and not(html/body/node())(つまり、存在していて、子ノードやテキストノードが含まれていないかどうかをテストするだけで)質問する必要があります。
Abel、

71

次の式を試してください。 boolean(path-to-node)


3
これは、PythonでXPathをlxmlと一緒に使用するときに必要なことです。
Iain Samuel McLean Elder

1
InfoPathでは、2010年の中にルールの条件とルールのアクションを構築するとき、これは御馳走を働いた
Merenzo

3
これは、他のほとんどの回答とは異なり、実際にはXPathクエリであるという意味で正しい回答です。
Paul Etherton 2013

48

Patrickは、の使用xsl:ifと、ノードの存在を確認するための構文の両方で正しいです。ただし、Patrickの応答が示すように、if-then-elseに相当するxslはないため、if-then-elseのようなものを探している場合は、通常xsl:choose、and を使用した方がよいでしょうxsl:otherwise。したがって、Patrickの構文例は機能しますが、これは代替手段です。

<xsl:choose>
 <xsl:when test="/html/body">body node exists</xsl:when>
 <xsl:otherwise>body node missing</xsl:otherwise>
</xsl:choose>

+1に注意してくださいif-then-else、またどうif-else if-elseですか?davenpcjの答えtest="somexpath"では、いつ作るのif-else if-elseですか?
AabinGunz、2011

3
@Abhishekはい、他の条件で複数のxsl:whenを指定して、マルチブランチステートメントを作成できます。xsl:otherwiseをデフォルトとして、if-then-elseではなくSELECTのようなものと考えてください。
davenpcj

これは素晴らしいですが、存在するか空かを確認したい場合はどうすればよいですか?
SearchForKnowledge

13

選択肢を使用した方がよい場合があります。式を2回以上入力する必要はなく(場合によっては誤入力することもありません)、追加のさまざまな動作に従うことができます。

count(/html/body) = 0特定の数のノードがセットよりも興味深いため、私はをよく使用します。たとえば、式に一致するノードが予期せずに複数存在する場合などです。

<xsl:choose>
    <xsl:when test="/html/body">
         <!-- Found the node(s) -->
    </xsl:when>
    <!-- more xsl:when here, if needed -->
    <xsl:otherwise>
         <!-- No node exists -->
    </xsl:otherwise>
</xsl:choose>

上記のコードで示したように、動作を変更し、さまざまな方法で複数の条件を処理するために、より多くのxsl:when句を追加できます。
davenpcj 2011

count(/html/body) = 0 天才!:DI が欠落しているとき(または何でも)/html[count(/body)=0]/someNodeを選択するために使用someNode/body
Stefan Rogin

1
@clickstefanは/html[count(/body)=0]何も選択せず、XMLに2つのルートノードはありません。たぶん/html[count(body)=0]、それは/html[not(body)]、またはと同じになります/html[not(exists(body))]
Abel

@Abelはい、/ html [count(// body)= 0]またはあなたの発言は恥ずべきことですが、はい、適切な例を挙げませんでした
Stefan Rogin

4

Rubyで作業してNokogiriを使用して要素をフェッチし、結果がnilかどうかを確認します。

require 'nokogiri'

url = "http://somthing.com/resource"

resp = Nokogiri::XML(open(url))

first_name = resp.xpath("/movies/actors/actor[1]/first-name")

puts "first-name not found" if first_name.nil?

3

count()を使用してJavaでxpathを使用する場合のバリエーション:

int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
    // body node missing
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.