XSLT 2.0正则表达式替换

时间:2015-06-22 23:12:04

标签: regex xml xslt xslt-2.0

我有以下XML:

<t>a_35345_0_234_345_666_888</t>

我想在&#34; _&#34;之后替换第一次出现的数字。具有固定数字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+_(.*)", "$1_234_$2")'/>
   </xsl:template>
</xsl:stylesheet>

更新

以下适用于我(感谢@ Chris85)。只需删除下划线并添加&#34;?使它不贪心。

<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>

1 个答案:

答案 0 :(得分: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>

以下是关于重复和贪婪的更多文档,http://www.regular-expressions.info/repeat.html