来自可迭代节点的子字符串

时间:2012-09-19 09:19:22

标签: xpath xpath-2.0

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

此XPath表达式//title/text()返回:

  

日常意大利语   哈利波特
  XQuery Kick Start
  学习XML

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

  

项目太多

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

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

2 个答案:

答案 0 :(得分:2)

使用

//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]

答案 1 :(得分:1)

试试这个

<强> 1。要获得除上一个之外的所有部分,请使用:

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

<强> 2。要获得第一个使用此功能:

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

希望这会有所帮助。