我是XSLT的新手。我想知道是否可以选择项目的子字符串。我正在尝试解析RSS提要。描述值包含的文本多于我想要显示的内容。我想基于某些子字符串的索引获取它的子字符串。基本上,我想显示一个子串调用的结果,传递indxOf('some_substring')和长度作为参数。这可能吗?
来自评论:
我想选择一个字符串的文本 发生后的位置 子串
答案 0 :(得分:45)
目前尚不清楚您想要对子字符串的索引做什么[更新:现在更清楚 - 谢谢]但您可以使用函数substring-after
或substring-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