노드가 존재하는지 xpath 찾기


201

xpath 쿼리를 사용하여 노드 (태그)가 존재하는지 어떻게 알 수 있습니까?

예를 들어 웹 사이트 페이지에 / html / body 및 / html / head / title과 같은 올바른 기본 구조가 있는지 확인해야하는 경우


필수 요소 표시와 함께 XML 스키마를 사용하는 것이 좋습니다. 따라서 문서가 사용하는지 확인하십시오.
abatishchev

답변:


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
이것은 lxml과 함께 Python에서 XPath를 사용할 때 필요한 것입니다.
Iain Samuel McLean Elder

1
이것은 InfoPath 2010 내에서 규칙 조건 및 규칙 작업을 구성 할 때 도움이되었습니다.
Merenzo

3
이것은 대부분의 다른 답변과 달리 실제로 XPath 쿼리라는 점에서 정답입니다.
Paul Etherton

48

Patrick은의 사용 xsl:if과 노드의 존재를 확인하기위한 구문에서 모두 정확 합니다. 그러나 Patrick의 응답에서 알 수 있듯이 if-then-else와 동등한 xsl은 없으므로 if-then-else와 유사한 것을 찾고 있다면 일반적으로 xsl:chooseand를 사용하는 것이 좋습니다 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

3
@Abhishek 예, 다른 조건에서 더 많은 xsl :을 넣을 수 있고 다중 분기 명령문을 가질 수 있습니다. xsl : otherwise를 기본값으로 사용하는 if-then-else보다 SELECT와 비슷하다고 생각하십시오.
davenpcj

이것은 굉장하지만 존재하거나 비어 있는지 확인하려면 어떻게해야합니까?
SearchForKnowledge

13

선택을 사용하는 것이 더 좋을 수도 있고, 식을 두 번 이상 입력하거나 잘못 입력 할 필요가 없으며, 다른 동작을 따를 수도 있습니다.

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

count(/html/body) = 0 천재! : DI 언제 (또는 무엇이든) /html[count(/body)=0]/someNodesomeNode/body
빠질

1
@clickstefan /html[count(/body)=0]은 아무것도 선택하지 않으며 XML에는 두 개의 루트 노드가있을 수 없습니다. 어쩌면 당신은 의미 /html[count(body)=0]와 동일 할 것이다, /html[not(body)]또는 /html[not(exists(body))].
Abel

@Abel 예, / html [count (// body) = 0] 또는 부끄러운
말이지

4

나는 Ruby에서 일하고 Nokogiri를 사용하여 요소를 가져 와서 결과가 0인지 확인합니다.

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.