XSLT正则表达式 - 没有后跟

时间:2016-01-31 05:21:56

标签: regex xml xslt xslt-2.0

我需要查找未跟空格的','文本,并在XSLT中为每个文本显式添加空格值。

示例:

输入:

<chap>
    <para>10,20,30,40,50,60,</para>
    <para>10, 20, 30, 40, 50, 60</para>
</chap>

输出:

<chap>    
  <para>10,&#160;20,&#160;30,&#160;40,&#160;50,&#160;60,&#160;60,&#160;</para>
  <para>10, 20, 30, 40, 50, 60</para>
</chap>

XSLT

   <xsl:template match="text()">        
    <xsl:analyze-string select="." regex=",(?!\s)">
        <xsl:matching-substring>
            <xsl:value-of select="."/>
            <xsl:text>&#160;</xsl:text>
        </xsl:matching-substring>
    </xsl:analyze-string>     
</xsl:template>

我可以使用正则表达式执行此任务,但是任何人都可以建议我如何才能找到','字符后面没有space字符的文本?

3 个答案:

答案 0 :(得分:3)

您可以使用replace()函数替换逗号后跟非空白字符(例如$x),逗号+ &#160; +非空白字符{{1} }:

$x

<强> xsltransform demo

答案 1 :(得分:2)

我愿意

string-join(tokenize($in, ',\s*'), ', ')

这假设用逗号替换单个空格后的多个空格是可以接受的。

(注意到@pouyan已经在评论中提出了这种方法)。

答案 2 :(得分:0)

这是一个支持exslt的xslt-1.0解决方案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fn="http://www.w3.org/2005/xpath-functions"
                xmlns:str="http://exslt.org/strings"
                extension-element-prefixes="fn str">

    <xsl:output method="xml" version="1.0" indent="yes"/>

    <xsl:template match="/">
        <xsl:apply-templates select="/node()"/>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{name(.)}">
            <xsl:copy-of select="./@*"/>
            <xsl:apply-templates select="./node()"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="text()">
        <xsl:value-of select="."/>
    </xsl:template>

    <xsl:template match="text()[contains(., ',')][count(str:split(., ',')) &gt; count(str:split(., ', '))]">
        <xsl:choose>
            <xsl:when test="contains(., ',')">
                <xsl:for-each select="str:tokenize(., ', ')">
                    <xsl:value-of select="."/>

                    <xsl:if test="position() != last()">
                        <xsl:text>, </xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </xsl:when>

            <xsl:otherwise>
                <xsl:value-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

最后一个文本模板仅匹配包含“,”后面没有空格的文本