Sử dụng truy vấn xpath làm thế nào để bạn tìm thấy nếu một nút (thẻ) tồn tại?
Ví dụ: nếu tôi cần đảm bảo một trang web có cấu trúc cơ bản chính xác như / html / body và / html / head / title
Sử dụng truy vấn xpath làm thế nào để bạn tìm thấy nếu một nút (thẻ) tồn tại?
Ví dụ: nếu tôi cần đảm bảo một trang web có cấu trúc cơ bản chính xác như / html / body và / html / head / title
Câu trả lời:
<xsl:if test="xpath-expression">...</xsl:if>
ví dụ
<xsl:if test="/html/body">body node exists</xsl:if>
<xsl:if test="not(/html/body)">body node missing</xsl:if>
html/body and not(html/body/node())
(nghĩa là chỉ kiểm tra nếu nó tồn tại và nó không chứa bất kỳ nút con hoặc nút văn bản nào).
Hãy thử biểu thức sau: boolean(path-to-node)
Patrick là chính xác, cả trong việc sử dụng xsl:if
và trong cú pháp để kiểm tra sự tồn tại của một nút. Tuy nhiên, như phản hồi của Patrick ngụ ý, không có xsl tương đương với if-then-other, vì vậy nếu bạn đang tìm kiếm thứ gì đó giống như if-then-other, bạn thường sử dụng tốt hơn xsl:choose
và xsl:otherwise
. Vì vậy, cú pháp ví dụ của Patrick sẽ hoạt động, nhưng đây là một thay thế:
<xsl:choose>
<xsl:when test="/html/body">body node exists</xsl:when>
<xsl:otherwise>body node missing</xsl:otherwise>
</xsl:choose>
if-then-else
, còn về cái gì if-else if-else
? Trong câu trả lời của davenpcj tôi có thể đặt test="somexpath"
thứ 2 khi nào thực hiện if-else if-else
không?
Có thể tốt hơn để sử dụng một lựa chọn, không phải gõ (hoặc có thể gõ nhầm) biểu thức của bạn nhiều lần và cho phép bạn theo dõi các hành vi khác nhau.
Tôi rất thường sử dụng count(/html/body) = 0
, vì số lượng nút cụ thể thú vị hơn tập hợp. Ví dụ ... khi có nhiều hơn 1 nút phù hợp với biểu thức của bạn.
<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>
count(/html/body) = 0
Thiên tài ! : DI sử dụng nó như /html[count(/body)=0]/someNode
để chọn someNode
khi nào /body
(hoặc bất cứ thứ gì) bị thiếu
/html[count(/body)=0]
sẽ không bao giờ chọn bất cứ thứ gì, không thể có hai nút gốc trong XML. Có lẽ bạn có nghĩa là /html[count(body)=0]
, sẽ giống như /html[not(body)]
, hoặc /html[not(exists(body))]
.
Tôi làm việc trong Ruby và sử dụng Nokogiri, tôi tìm nạp phần tử và xem thử kết quả có phải không.
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?
Một biến thể khi sử dụng xpath trong Java bằng cách sử dụng Count ():
int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
// body node missing
}