【问题标题】:Getting text from XPath but want elements?从 XPath 获取文本但想要元素?
【发布时间】:2017-12-09 13:50:05
【问题描述】:

我是 XPath 的新手,所以请多多包涵。基本问题。

我想选择文本,包括元素。下面的示例输入:

<node1>   
    <node2>
        <node3>A1</node3>
        <node3>A2</node3>
        <node3>A3</node3>
        <node3>A4</node3>    
    </node2> 
</node1>

我希望复制节点2的内容,包括标签,即:

<node2>
    <node3>A1</node3>
    <node3>A2</node3>
    <node3>A3</node3>
    <node3>A4</node3>    
</node2> 

但是,如果我使用 XPath /node1/node2/,我只能得到值 A1 A2 A3 A4(而不是 node2node3 标记)。

【问题讨论】:

  • /node1/node()[not(self::text())] 怎么样?
  • @Andersson:上面的表达式返回语法错误 - 没有匹配的文本()
  • 请发布您正在使用的 XSLT 代码。 没有看到您的代码,我能猜到的最好的结果是您的代码导致选择了正确的节点(元素),但没有具体处理,则应用默认的 XSLT 规则——即简单地输出选定节点的文本值。

标签: xml xslt xpath xpath-2.0 xpathnavigator


【解决方案1】:

xpath /node1/node2 应该返回nodes 的列表。每个node(取决于您使用的语言)都包含nodeNamenodeValue 等属性,您可以使用这些属性来访问包含的文本和标签的名称。

【讨论】:

  • 我正在使用 tibco BW 的内部 xpath 功能。你有什么建议吗?
【解决方案2】:

Correct XPath query to fetch div inner text

使用 text() 函数:

//node1/node2/text()

【讨论】:

  • 它不返回任何内容 //node1/node2/text() ,但是当我这样做时返回 A1 A2 A3 A4 //node1/node2[text()] - 因此问题仍未解决。跨度>
  • @Negarrak,提问者特别提到他们也想要元素,而不仅仅是文本。
  • @EiríkrÚtlendi 他说:“我想选择文本,包括元素”所以,从 A1A2A3A4 我明白他想要A1A2A3 A4 正确的表达式是 //node1/node2[text()] 。我的答案没有错。
  • @Negarrak,您的帖子不包括谓词指示符[]。 XPath 语句//node1/node2/text()只选择文本,而不选择元素。
  • @EiríkrÚtlendi 没有这样的东西,或者你正在拉一个字符串,或者一个元素数组。通过他们的提问,他想要文本。也许他太新了,不知道自己想要什么。
【解决方案3】:

但是,如果我将 xpath 用作 /node1/node2 - 我只会得到值 A1 A2 A3 A4(而不是 node2node3 标签)。

不正确。 XPath,/node1/node2 选择 node2 elementnode1,而不是文本节点或字符串。如果您只看到此 XPath 的 A1 A2 A3 A4,那么您是在自动转换为字符串值的上下文中评估 XPath。

您不需要新的 XPath;您需要以不同的方式评估您已经拥有的 XPath 的结果。例如,如果您正在使用

<xsl:value-of select="/node1/node2"/>

您应该迭代节点集或将模板应用于节点集中的所有元素,

<xsl:apply-templates select="/node1/node2"/>

或者在 XSLT 2.0 中,返回一个序列,

<xsl:sequence select="/node1/node2"/>

等,具体取决于您需要对所选元素执行的操作。

【讨论】:

    【解决方案4】:
    ./node1/node()
    

    或:

    ./node1/node2/../node()
    

    当你想要整个 HTML 节点时,用 /node() 结束 Xpath。

    【讨论】:

      【解决方案5】:

      选择 node2 元素及其内部的所有内容:

      xPath://node2/descendant-or-self::*

      css:node2,node2 *

      只选择没有node2标签的内部内容:

      xPath://node2/descendant::*

      css:node2 *

      【讨论】:

        猜你喜欢
        • 2015-01-03
        • 1970-01-01
        • 2016-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-18
        • 2020-03-24
        • 1970-01-01
        相关资源
        最近更新 更多