XSLT 2.0 正则表达式替换
XSLT 2.0 regular expression replace
我有以下 XML:
<t>a_35345_0_234_345_666_888</t>
我想用固定数字 234 替换“_”后第一次出现的数字。因此结果应如下所示:
<t>a_234_0_234_345_666_888</t>
我试过使用以下方法但它不起作用:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
<xsl:value-of select='replace(., "(.*)_\d+_(.*)", "_234_")'/>
</xsl:template>
</xsl:stylesheet>
更新
以下对我有用(感谢@Chris85)。只需删除下划线并添加“?”使其不贪心。
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
<xsl:value-of select='replace(., "(.*?)_\d+(.*)", "_234")'/>
</xsl:template>
</xsl:stylesheet>
你的正则表达式 is/was 贪婪,.*
消耗所有内容,直到下一个字符的最后一次出现。
所以
(.*)_\d+_(.*)
正在投入
a_35345_0_234_345_666_
变成</code>。然后 <code>888
被删除,</code> 没有任何内容。</p>
<p>为了使其成为非贪婪的,在 <code>.*
之后添加一个 ?
。这告诉 *
在下一个字符第一次出现时停止。
函数示例:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
<xsl:value-of select='replace(., "(.*?)_\d+(.*)", "_234")'/>
</xsl:template>
</xsl:stylesheet>
这里有更多关于重复和贪婪的文档,http://www.regular-expressions.info/repeat.html。
我有以下 XML:
<t>a_35345_0_234_345_666_888</t>
我想用固定数字 234 替换“_”后第一次出现的数字。因此结果应如下所示:
<t>a_234_0_234_345_666_888</t>
我试过使用以下方法但它不起作用:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
<xsl:value-of select='replace(., "(.*)_\d+_(.*)", "_234_")'/>
</xsl:template>
</xsl:stylesheet>
更新
以下对我有用(感谢@Chris85)。只需删除下划线并添加“?”使其不贪心。
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
<xsl:value-of select='replace(., "(.*?)_\d+(.*)", "_234")'/>
</xsl:template>
</xsl:stylesheet>
你的正则表达式 is/was 贪婪,.*
消耗所有内容,直到下一个字符的最后一次出现。
所以
(.*)_\d+_(.*)
正在投入
a_35345_0_234_345_666_
变成</code>。然后 <code>888
被删除,</code> 没有任何内容。</p>
<p>为了使其成为非贪婪的,在 <code>.*
之后添加一个 ?
。这告诉 *
在下一个字符第一次出现时停止。
函数示例:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
<xsl:value-of select='replace(., "(.*?)_\d+(.*)", "_234")'/>
</xsl:template>
</xsl:stylesheet>
这里有更多关于重复和贪婪的文档,http://www.regular-expressions.info/repeat.html。