我有一个这样的样本xsl,
@H_301_35@解决方法
<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="(\.)( )(\.)"> <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>
我认为
<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>