【问题标题】:Extracting and grouping all text nodes using Xpath 2.0使用 Xpath 2.0 提取和分组所有文本节点
【发布时间】:2012-01-14 23:35:05
【问题描述】:

我想从特定文档的子节点中提取所有文本,并返回一个文本数组。我认为在示例中显示它会更容易:

给定文件:

<root>
    <div>
        some text
        <p>some other text</p>
    </div>

    <div>
        another text
        <b>yet another text <em>even more</em></b>
        end of text
    </div>
</root>

我想构造一个返回两个元素的表达式:

 [0] some text someother text
 [1] another text yet another text even more end of text

我尝试了很多表达式,但我似乎在这里遗漏了一些东西,单独提取 div 很容易(只是 //div),但是如何将它们分组并分别加入每个 div 中的所有 text() 子节点?

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    text()是你的朋友:

    您必须分两步完成。

    //div
    

    然后:

    //text()
    

    然后以编程方式合并它们。

    XPath 是一种查询语言,就像 CSS 选择器一样,不能转换事物。所有功能(如normalize-text)都用于优化您的选择器而不是修改输入本身。

    见:how to get the normalize-space() xpath function to work?

    【讨论】:

    • 不。 //div/text() 将返回更多节点,因为第一个 div 至少有 1 个文本节点,第二个 div 至少有 2 个文本节点。 //div//text() 将返回更多节点。我正在寻找的表达式应该分别连接每个 div 中的所有 text() 节点。类似 //div/concat(.//text()) 的东西,但它当然不起作用。
    • 另外我在 Java 应用程序中使用纯 XPATH,我无法使用 XSLT 进行后处理,因此我正在寻找纯 XPATH 解决方案
    • 这里不是纯 XPath 解决方案,很抱歉。将 XPath 视为 CSS 选择器……它们只是选择器而不是转换器。
    【解决方案2】:

    使用 XPath 2.0(假设您的输入格式正确并添加了一些 &lt;/b&gt;),您可以使用像 /root/div/normalize-space() 这样的路径,它为您提供两个字符串序列“一些文本一些其他文本”和“另一个文本另一个文本甚至更多文本的结尾”。

    【讨论】:

    • 我曾尝试在 Saxon 9 的测试 Java 应用程序中使用此表达式。不幸的是,设置 returnType 时出现问题。从评估()方法。如果我将类型设置为 XpathConstants.STRING,我只会得到第一个字符串值“一些文本和其他文本”,我认为表达式应该可以工作。但是如何将返回类型标记为“字符串数组”呢? XpathConstants.NODESET 的返回类型不起作用,因为我们正在处理字符串节点...
    • ̀normalize-space() 是一个函数而不是一个选择器。
    • 返回类型的问题在于您使用的是 JAXP API,它从未针对 XPath 2.0 进行过扩展,因此它不允许您请求包含字符串序列的结果。请改用 Saxon 的 s9api 接口。
    • greut,我知道 normalize-space 是一个函数,但问题的发布者提到了 XPath 2.0,在 XPath 2.0 中,您可以在路径表达式的最后一步中使用函数调用。我认为我的建议尽可能解决了 XPath 2.0 的问题(它返回两个字符串的序列,而不是两个字符串的数组)。
    【解决方案3】:

    XPath 不能构造新节点:为此您需要 XSLT 或 XQuery。因此,表达式永远不能返回源文档中不存在的元素。但是,使用 XPath 2.0,您可以轻松地返回两个字符串:除了少量的空白细节,您可以从表达式 //div/normalize-space(.) 获得所需的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多