【问题标题】:Difference between text() and string()text() 和 string() 的区别
【发布时间】:2012-03-18 14:54:01
【问题描述】:

谁能解释一下 text() 和 string() 函数的区别。我经常用一个和另一个,但没有任何区别,两者都会得到xml节点的字符串值。

【问题讨论】:

    标签: xpath


    【解决方案1】:

    谁能解释一下 text() 和 string() 的区别 功能。

    我。 text() 不是函数,而是node test

    用于选择上下文节点的所有文本节点子节点。

    所以,如果上下文节点是一个名为x 的元素,那么text() 会选择x 的所有文本节点子节点。

    其他示例

    /a/b/c/text()
    

    选择作为顶部元素a 的子元素的任何b 元素的子元素的任何c 元素的所有文本节点子元素。

    二。 string() 函数

    根据定义string(exprSelectingASingleNode)返回节点的string value

    元素的字符串值是其所有文本节点后代的串联——按文档顺序。

    因此,如果在以下 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
    "
    

    【讨论】:

      【解决方案2】:

      大多数情况下,如果您想要元素节点 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>
      

      【讨论】:

      • 我曾经相信使用像 select="/somenode/text()" 这样的表达式确实会更精确,更不容易出错。所以你建议 /text() 部分是不必要的,甚至是一个错误?您能否简要讨论一下何时使用 /text() 是个好主意或有用?谢谢
      • 评论不是用来补充问题的,请提出一个新问题。
      • (换句话说)您关于 "string() 自动应用" 的陈述在多个 XSLT 元素中是正确的,例如 xsl:value-of。但是,请注意,用户在他的问题中根本没有提到 XSLT。因此,正如您所解释的,使用 text() 或 string() 通常是错误/不必要的在 XSLT 中,但是当期望字符串值节点,否则我们将获得完整节点,对吗?而 text() 更适合专门浏览文本节点。
      • 是的,有一些上下文(XQuery &lt;a&gt;{x/y/z}&lt;/a&gt; 是最臭名昭著的例子;另一个是 instance of)没有隐式原子化,因此应该手动完成:使用 string()data() 几乎总是比使用 /text() 更好。
      猜你喜欢
      • 2022-12-04
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 2012-11-19
      • 2011-10-03
      • 1970-01-01
      • 2015-03-07
      相关资源
      最近更新 更多