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