簡體   English   中英

text()和string()之間的區別

[英]Difference between text() and string()

有人可以解釋text()和string()函數之間的區別。 我經常使用其中一個,但它沒有任何區別,兩者都將獲得xml節點的字符串值。

有人可以解釋text()和string()函數之間的區別。

I. text()不是函數,而是節點測試

它用於選擇上下文節點的所有文本節點子節點。

因此,如果上下文節點是名為x的元素,則text()選擇x所有文本節點子節點。

其他例子

/a/b/c/text()

選擇任何c元素的所有文本節點子元素,該元素是作為頂部元素a的子元素的任何b元素的子元素。

II。 string()函數

根據定義, string(exprSelectingASingleNode)返回節點的字符串值

元素的字符串值是所有文本節點后代的串聯 - 按文檔順序排列。

因此,如果在以下XML文檔中

<a>
  <b>2</b>
  <c>3
    <d>4</d>
  </c>
  5
</a>

string(/a)返回(沒有周圍的引號):

"
  2
  3
    4

  5
"

正如我們所看到的,字符串值反映了三個僅限空格的文本節點,我們通常無法注意到這些節點。

一些XML解析器可以選擇剝離僅限空白的文本節點。 如果上面的文檔是使用剝離的僅空白文本節點解析的,那么相同的函數:

string(/a)

現在返回:

"23
    4
  5
"

大多數情況下,如果您想要元素節點X的內容,您可以將其稱為“。”,如果它是上下文節點,或者如果它是上下文節點的子節點則稱為“X”。 例如:

<xsl:if test="X = 'abcd'">...

要么

<xsl:value-of select="."/>

在這兩種情況下,由於上下文需要字符串,因此會自動應用string()函數。 (這是一個小小的簡化,如果你正在運行模式感知的XSLT 2.0,規則會稍微復雜一些)。

這里使用“ string() ”是不必要的,因為它是自動完成的; 並且使用text()是一個錯誤(一個似乎越來越普遍的錯誤,受到網絡上一些不好的教程的鼓勵)。 在這種情況下使用./text()X/text()會為您提供元素的所有文本節點子節點。 元素通常有一個文本節點子節點,其字符串值恰好與元素的字符串值相同,但如果有人添加注釋或處理指令,則代碼會失敗,因為該值會被分割為多個文本節點。 如果元素是一個(例如“ title ”)允許混合內容,它也會失敗: string(title)title/text()將給出相同的答案,直到您點擊帶有標題的文章

<title>On the wetness of H<sub>2</sub>O</title>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM