我不明白爲什麼我們應該使用text()而不是使用「。」。 有什麼區別?這兩個XPath查詢之間的區別
//library/book/author[text() = "An Author"]
VS
//span[@class="whateverclass"][. = "An Author"]
我不明白爲什麼我們應該使用text()而不是使用「。」。 有什麼區別?這兩個XPath查詢之間的區別
//library/book/author[text() = "An Author"]
VS
//span[@class="whateverclass"][. = "An Author"]
的差異可能是最好的一個例子,其中一個元件具有一個或多個子元素,並且多個文本元素示出(一個元件被允許子元素之間散佈的多個文本元素):
<element>
text1
<child>
child1text1
<child>
text2
</element>
假設element
是電流:
.
將返回text1 child1text1 text2
(與空白)text()[1]
將返回text1
text()[2]
將返回text2
請特別注意其中text()
將表現不同的XSLT 1.0 VS XSLT 2.0
text()
回報只是text1
在xslt 1.0text()
返回text1 text2
(與空白)在XSLT 2.0.
爲您提供了當前節點的文本和所有的childNodes
text()
給你當前節點只
結論的文字:使用text()
如果您想檢查節點中的文本,因爲使用.
您將檢查文本所有潛在的childNodes太
.
是包含單一節點,當前上下文節點(在您的示例span
元件節點)的節點集。這樣做的字符串值是其所有後代文本節點的拼接,所以如果你有
<span class="whateverclass">Ann <b>A.</b> Author</span>
這將是字符串"Ann A. Author"
(不帶引號)。
text()
是包含上下文節點的所有直接子文本節點(上述示例中的兩個節點"Ann "
和" Author"
)的節點集。一個=
比較,其中一側是節點組,而另一個是一個字符串爲真,如果節點的任何具有給定的字符串值,因此上述示例<span>
元件將匹配任何圖案的
span[@class='whateverclass'][. = 'Ann A. Author']
span[@class='whateverclass'][text() = 'Ann ']
span[@class='whateverclass'][text() = ' Author']
但會不是匹配[text() = 'Ann A. Author']
您通常不應使用text()。使用「。」彙編字符串值,忽略註釋和處理指令,而text()可以根據註釋出現的位置將文本分成幾塊。當您想要一次處理混合內容時,只能使用文本。
由text()選擇的節點集/序列在xpath 1.0和2.0(它是兩個文本節點的序列)中是相同的,區別在於這個序列被轉換爲字符串。即使在xpath 2.0'element [text()='text1 text2']'也不會匹配這個'element',因爲序列中沒有單個節點具有該字符串值。 –
@Ian感謝您的澄清 - 我可以證實差異的原因是由於結果樹碎片(1)與節點集(2)的字符串序列化的差異? – StuartLC
不是。不同之處在於,在XSLT 1.0中,當您聲明''並且'foo'是一個包含多個節點的節點集時,結果就是第一個節點的字符串值該集合,而在XSLT 2.0中,它是由_all_用空格分隔的節點的字符串值的串聯。 –