XSL substring和indexOf

Car*_*nco 23 xslt xpath

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

来自评论:

我想选择在substring出现之后的字符串文本

Lar*_*rsH 48

目前尚不清楚你想要对子串的索引做什么[更新:现在更清楚了 - 谢谢]但是你可以使用这个函数substring-after或者substring-before:

substring-before('My name is Fred', 'Fred')
Run Code Online (Sandbox Code Playgroud)

回报'My name is '.

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

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

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

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


MrW*_*son 9

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

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

contains($text,$searchString)*(1 + string-length(substring-before($text,$searchString)))
Run Code Online (Sandbox Code Playgroud)

如果你需要的第一个字符的位置找到的字符串,或者0,如果它不存在:

contains($text,$searchString)*(1 + string-length(substring-before($text,$searchString)) + string-length($searchString))
Run Code Online (Sandbox Code Playgroud)

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

1 + string-length($right) - string-length(substring-after($right,$searchString))
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

我想选择在substring出现之后的字符串文本

你可以使用:

substring-after($string,$match)
Run Code Online (Sandbox Code Playgroud)

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

substring(substring-after($string,$match),1,$length)
Run Code Online (Sandbox Code Playgroud)

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

substring(substring-after($string,substring-before($string,$match)),
          string-length($match) * contains($string,$match) + 1,
          $length) 
Run Code Online (Sandbox Code Playgroud)


Hem*_*ant 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>    
Run Code Online (Sandbox Code Playgroud)

以下是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>   
Run Code Online (Sandbox Code Playgroud)