【问题标题】:The difference between these 2 XPath queries这 2 个 XPath 查询之间的区别
【发布时间】:2012-12-17 10:38:24
【问题描述】:

我不明白为什么我们应该使用 text() 而不是只使用 "." 有什么区别?

//library/book/author[text() = "An Author"]

vs

//span[@class="whateverclass"][. = "An Author"]

【问题讨论】:

    标签: php xml xpath xpath-2.0


    【解决方案1】:

    . 为您提供当前节点和所有子节点的文本

    text() 只给你当前节点的文本

    结论:如果你想检查节点中的文本,请使用text(),因为使用.,你也会检查所有潜在子节点的文本

    【讨论】:

      【解决方案2】:

      . 是一个包含单个节点的节点集,即当前上下文节点(您的示例中的 span 元素节点)。 this 的字符串值是其所有后代文本节点的串联,所以如果你有

      <span class="whateverclass">Ann <b>A.</b> Author</span>
      

      这将是字符串"Ann A. Author"(不带引号)。

      text() 是一个节点集,包含上下文节点的所有直接子文本节点(上例中的两个节点 "Ann " 和 " Author")。 = 比较其中一侧是节点集,另一侧是字符串,如果 any 节点具有给定的字符串值,则为真,因此上述示例 &lt;span&gt; 元素将匹配任何模式

      span[@class='whateverclass'][. = 'Ann A. Author']
      span[@class='whateverclass'][text() = 'Ann ']
      span[@class='whateverclass'][text() = ' Author']
      

      但会不匹配[text() = 'Ann A. Author']

      【讨论】:

        【解决方案3】:

        你通常不应该使用 text()。使用 ”。”组装字符串值,忽略 cmets 和处理指令,而 text() 可以根据 cmets 出现的位置将文本分成几部分。仅当您想一次处理一个混合内容时才使用文本。

        【讨论】:

          【解决方案4】:

          这个区别可能最好用一个例子来说明,其中一个元素有一个或多个子元素,以及多个文本元素(一个元素允许多个文本元素散布在子元素之间):

          <element>
            text1
            <child>
               child1text1
            <child>
            text2
          </element>
          

          假设element 是当前的:

          • . 将返回 text1 child1text1 text2(带有空格)
          • text()[1] 将返回text1
          • text()[2] 将返回text2

          特别注意text() 在 xslt 1.0 和 xslt 2.0 中的行为会有所不同

          • text() 在 xslt 1.0 中只返回 text1
          • text() 在 xslt 2.0 中返回 text1 text2(带有空格)

          【讨论】:

          • text() 选择的节点集/序列在 xpath 1.0 和 2.0 中都是相同的(它是两个文本节点的序列),不同之处在于这个序列转换为字符串的方式.即使在 xpath 2.0 中,element[text() = 'text1 text2'] 也不会匹配此 element,因为序列中没有单个节点具有该字符串值。
          • @Ian 感谢您的澄清 - 我可以确认造成差异的原因是由于结果树片段 (1) 与节点集 (2) 的字符串序列化不同吗?
          • 并非如此。不同之处在于,在 XSLT 1.0 中,当您说 &lt;xsl:value-of select="foo"/&gt; 和 foo 是一个包含多个节点的节点集时,结果是该集中第一个节点的字符串值,而在 XSLT 2.0 中,它是所有个节点的字符串值,以空格分隔。
          猜你喜欢
          • 2020-01-02
          • 2014-06-02
          • 2011-09-19
          • 2017-01-30
          • 1970-01-01
          • 2020-08-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多