【问题标题】:Substrings from iterable node来自可迭代节点的子字符串
【发布时间】:2012-09-19 09:19:22
【问题描述】:

请考虑这个示例文件:http://www.w3schools.com/dom/books.xml

这个 XPath 表达式 //title/text(),返回:

日常意大利语
哈利波特
XQuery 快速入门
学习 XML

现在我只想要名字,然后尝试:tokenize(//title/text(),' ')[1],它会返回:

项目太多

OTOH tokenize((//title/text())[1],' ')[1] 返回第一个节点的名字。

如何在迭代节点时使用 XPath 获取子字符串?

【问题讨论】:

  • theta,我的回答对您有用还是您还有问题?您是否注意到它比当前接受的答案至少短两倍,并且效率更高?
  • 问候迪米特。感谢您提供额外的答案(我投票赞成),以及包含的提示和进一步的解释。它非常有用,我希望其他人也会很快投票。我已经将 Cylian 的答案标记为正确,因为它向我显示了错误并引导我找到 //title/tokenize(text(),' ')[1] 解决方案,这非常适合我的问题。干杯

标签: xpath xpath-2.0


【解决方案1】:

使用

//text()/tokenize(.,' ')[1]

这会生成 XML 文档中每个文本节点的第一个“单词”的序列。

基于 XSLT 2.0 的验证

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:sequence select="//text()/tokenize(.,' ')[1]"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时:

<t>
    <a>Everyday Italian</a>
    <b>Harry Potter</b>
    <c>XQuery Kick Start</c>
    <d>Learning XML</d>
</t>

计算 XPath 表达式并将计算结果复制到输出:

 Everyday 
 Harry 
 XQuery 
 Learning 

以上包括一些纯空白文本节点。

如果您想忽略任何仅包含空格的文本节点,请将 XPath 表达式更改为

//text()[normalize-space()]/tokenize(.,' ')[1]

【讨论】:

    【解决方案2】:

    试试这个

    1.要获取除最后一个以外的所有部分,请使用以下命令:

    //title/string-join(tokenize(.,'\s+')[position() ne last()],' ')
    

    2。要只获得第一个,请使用:

    //title/string-join(tokenize(.,'\s+')[position() eq 1],' ')
    

    希望这会有所帮助。

    【讨论】:

    • 啊,谢谢,这给了我线索。因此,不应在整个 XPath 表达式上调用函数,而应仅在返回文本的部分上调用函数。然而,这要简单得多://title/tokenize(text(),' ')[1],而且效果很好。干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    相关资源
    最近更新 更多