我有一个像这样的样本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="(\.)( )(\.)">
<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以获得正确的输出..
答案 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>