XSLT - 通过分析文本节点

时间:2015-09-01 01:33:48

标签: regex xml xslt xslt-2.0

我有如下的XML,

<doc>
    <chap>
        The bowler delivers the ball 
        to the batsman who attempts to 
        hit the ball with his bat away from 
        the fielders so he can run to the 
        other end of the pitch and score a run.
    </chap>
</doc>

我的要求是将名为<p>的新节点添加到<chap>文本节点,其中将<p>节点添加到每个新行。

所以,期望的输出是,

<doc>
    <chap>
        <p>The bowler delivers the ball</p>
        <p>to the batsman who attempts to</p>
        <p>hit the ball with his bat away from</p> 
        <p>the fielders so he can run to the</p> 
        <p>other end of the pitch and score a run.</p>
    </chap>
</doc>

您能否给我一个建议?如何使用正则表达式在XSLT中执行此操作并按换行符分隔文本(#xA)。

我试图完成这项任务,但想不到办法做到这一点。

1 个答案:

答案 0 :(得分:2)

您可以使用xsl:analyze-string选择空格和换行符之间的文字:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:output indent="yes"/>

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

    <xsl:template match="chap/text()">
        <xsl:analyze-string select="." regex="\s*(.*)\n">
            <xsl:matching-substring>
                <p><xsl:sequence select="regex-group(1)"/></p>
            </xsl:matching-substring>
        </xsl:analyze-string>
    </xsl:template>

</xsl:stylesheet>

或者您可以使用tokenize()拆分换行符

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:output indent="yes"/>

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

    <xsl:template match="chap/text()">
        <xsl:for-each select="tokenize(., '\n')[normalize-space()]">
            <p><xsl:sequence select="normalize-space()"/></p>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>