我有一个XML,text()节点格式不正确,
示例:
<section>
<p>A number,of words have, been, suggested,as sources for,the term,</p>
</section>
在一些'之后','没有空格字符,有些确实存在。我需要做的是,如果','后面没有空格字符,请在','字符后添加'*'字符。
所以,预期的结果,
<section>
<p>A number,*of words have, been, suggested,*as sources for,*the term*</p>
</section>
我认为这可以使用正则表达式来完成,但是我如何选择XSLT中正则表达式中没有空格的字符。还有一些,存在于关闭元素之前(最后一个,在输入中),我也需要选择它们。
<xsl:template match="para">
<xsl:copy>
<xsl:analyze-string select="." regex=",\s*">
<xsl:matching-substring>
<xsl:value-of select="regex-group(1)"/>
<xsl:value-of select="'*'"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:copy>
</xsl:template>
答案 0 :(得分:3)
您已使用,
替换了输入中的最后一个,*
,但您的声明并未说明。我希望下面的XSLT有所帮助:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="p/text()">
<xsl:value-of select="replace(., ',([^\s]|$)',',*$1')"/>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@*, node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输出:
<?xml version="1.0" encoding="UTF-8"?>
<section>
<p>A number,*of words have, been, suggested,*as sources for,*the term,*</p>
</section>
这里,正则表达式,([^\s]|$)
匹配逗号和之后的第一个字符(如果不是空格字符); ,*$1
将,
替换为,*
,并保持匹配组的完整性。