XSLT - 正则表达式替换字符

时间:2016-08-26 09:44:11

标签: regex xml xslt

我有一个像这样的样本xsl,

<doc>
  <para>text . . .text</para>
  <para>text . . .text. . . . . .text</para>
</doc>

正如您所看到的,xml中有一些模式,如. . . 我需要的是用*替换点之间存在的空间。所以输出应该看起来像,

<doc>
  <para>text .*.*.text</para>
  <para>text .*.*.text.*.*.*.*.*.text</para>
</doc>

我已经在xslt之后写了这个,

<xsl:template match="text()">
        <xsl:analyze-string select="." regex="(\.)(&#x0020;)(\.)">
            <xsl:matching-substring>
                <xsl:value-of select="replace(.,regex-group(2),'*')"/>
            </xsl:matching-substring>
            <xsl:non-matching-substring>
                <xsl:value-of select="."/>
            </xsl:non-matching-substring>
        </xsl:analyze-string>
    </xsl:template>

但它消除了所有其他空间并给我以下结果,

<doc>
  <para>text .*. .text</para>
  <para>text .*. .text.*. .*. .*.text</para>
</doc>

如何修改我的XSLT以获得正确的输出..

1 个答案:

答案 0 :(得分:3)

我认为

<xsl:template match="text()">
    <xsl:analyze-string select="." regex="(\.)( )(\.)( \.)*">
        <xsl:matching-substring>
            <xsl:value-of select="replace(., ' ','*')"/>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="."/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:template>

完成这项工作。正如LukStorms指出的那样,可以简化为

<xsl:template match="text()">
    <xsl:analyze-string select="." regex="\.( \.)+">
        <xsl:matching-substring>
            <xsl:value-of select="replace(., ' ','*')"/>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="."/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:template>