我有如下的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
)。
我试图完成这项任务,但想不到办法做到这一点。
答案 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>