XSLT 2.0 正则表达式替换

M T*_*ker 5 regex xml xslt xslt-2.0

我有以下 XML:

<t>a_35345_0_234_345_666_888</t>
Run Code Online (Sandbox Code Playgroud)

我想用固定数字 234 替换“_”之后第一次出现的数字。所以结果应该是这样的:

<t>a_234_0_234_345_666_888</t>
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下方法但它不起作用:

<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+_(.*)", "$1_234_$2")'/>
   </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

更新

以下对我有用(感谢@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+(.*)", "$1_234$2")'/>

   </xsl:template>
 </xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

chr*_*s85 3

您的正则表达式是/曾经是贪婪的,它.*会消耗所有内容,直到最后一次出现下一个字符。

所以

(.*)_\d+_(.*)

正在投入

a_35345_0_234_345_666_

进入$1。然后888被移除,什么也没有进去$2

为了使其非贪婪,?.*. 这告诉它*在下一个字符第一次出现时停止。

功能示例:

<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+(.*)", "$1_234$2")'/>
   </xsl:template>
 </xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

这里有一些关于重复和贪婪的更多文档,http://www.regular-expressions.info/repeat.html