XSLT - 分析以下文本值

时间:2016-02-01 11:02:24

标签: regex xml xslt xslt-2.0

我有一个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>

1 个答案:

答案 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,替换为,*,并保持匹配组的完整性。