XSL substring和indexOf

时间:2010-12-01 17:39:57

标签: xslt xpath

我是XSLT的新手。我想知道是否可以选择项目的子字符串。我正在尝试解析RSS提要。描述值包含的文本多于我想要显示的内容。我想基于某些子字符串的索引获取它的子字符串。基本上,我想显示一个子串调用的结果,传递indxOf('some_substring')和长度作为参数。这可能吗?

来自评论

  

我想选择一个字符串的文本   发生后的位置   子串

6 个答案:

答案 0 :(得分:45)

目前尚不清楚您想要对子字符串的索引做什么[更新:现在更清楚 - 谢谢]但您可以使用函数substring-aftersubstring-before:< / p>

substring-before('My name is Fred', 'Fred')

返回'My name is '

如果需要更详细的控制,substring()函数可以带两个或三个参数:string,starting-index,length。省略长度以获得整个字符串的其余部分。

XPath中的字符串没有index-of()函数(仅适用于XPath 2.0中的序列)。如果您特别需要这个职位,可以使用string-length(substring-before($string, $substring))+1

还有contains($string, $substring)。这些都记录在案here。在XPath 2.0中,您可以使用正则表达式匹配。

(XSLT主要使用XPath来选择节点和处理值,所以这实际上更像是一个XPath问题。我这样标记了它。)

答案 1 :(得分:9)

以下是IndexOf($ text,$ searchString)的一些线性xpath 1.0表达式:

如果您需要所搜索字符串的 FIRST 字符的位置,或者如果不存在则需要0:

contains($text,$searchString)*(1 + string-length(substring-before($text,$searchString)))

如果您需要第一个字符的位置 AFTER 找到的字符串,或 0 (如果不存在):

contains($text,$searchString)*(1 + string-length(substring-before($text,$searchString)) + string-length($searchString))

或者,如果您需要第一个字符的位置 AFTER 找到的字符串,或长度+ 1 (如果不存在):

1 + string-length($right) - string-length(substring-after($right,$searchString))

这应该涵盖您需要的大多数情况。

注意:乘以contains(...)会导致contains(...)函数的true或false结果转换为1或0,这样可以优雅地提供“0未找到时”部分逻辑。

答案 2 :(得分:7)

  

我想选择一个字符串的文本   发生后的位置   子串

您可以使用:

substring-after($string,$match)

如果你想要一个具有一定长度的上述子串,那么使用:

substring(substring-after($string,$match),1,$length)

但是如果匹配的子字符串没有出现问题就会开始......所以,如果你想要一个特定长度的子字符串位于子字符串出现之后,或者如果没有匹配则从整个字符串开始,你可以使用:

substring(substring-after($string,substring-before($string,$match)),
          string-length($match) * contains($string,$match) + 1,
          $length) 

答案 3 :(得分:5)

以下是包含XML和XSLT的完整示例,其中使用了substring-before和substring-after

<?xml version="1.0" encoding="UTF-8"?>
<persons name="Group_SOEM">
    <person>
        <first>Joe Smith</first>
        <last>Joe Smith</last>
        <address>123 Main St, Anycity</address>
    </person>
</persons>    

以下是XSLT,它通过将值除以空格来更改名/姓的值,以便在应用此XSL后,第一个名称元素将具有值“Joe”和最后一个“Smith”。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="first">
    <first>
        <xsl:value-of select="substring-before(.,' ')" />
    </first>
</xsl:template> 
<xsl:template match="last">
    <last>
        <xsl:value-of select="substring-after(.,' ')" />
    </last>
</xsl:template> 
<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>   

答案 4 :(得分:2)

XSLT中有一个子字符串函数。示例here

答案 5 :(得分:0)

受PHP中的strpos()的启发,我编写了自己的索引函数。

getent