i具有带有substring的文本元素的XML,可以通过模式§d+
匹配:
<root>
<item>text-one §42 text-two</item>
</root>
是否可以将其用XSLT-1.0转换为分离的元素:
<p>
<xsl:text>text-one </xsl:text>
<a href="/link#42>§42</a>
<xsl:text> text-two</xsl:text>
</p>
这个样式表可以执行您想要的工作,只要
-
whitespace作为段落号的末端限制器
是可以的<xsl:template match="/"> <root> <xsl:apply-templates select="root/*"/> </root> </xsl:template> <xsl:template match="item"> <p> <xsl:call-template name="tokenize"> <xsl:with-param name="text" select="."/> </xsl:call-template> </p> </xsl:template> <xsl:template name="tokenize"> <xsl:param name="text"/> <xsl:choose> <xsl:when test="contains($text, '§')"> <xsl:if test="substring-before($text, '§') != ''"> <text><xsl:value-of select="substring-before($text, '§')"/></text> </xsl:if> <xsl:call-template name="buildParagraphAnchor"> <xsl:with-param name="tail" select="substring-after($text, '§')"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <text><xsl:value-of select="$text"/></text> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="buildParagraphAnchor"> <xsl:param name="tail"/> <xsl:variable name="paragraphNumber"> <xsl:choose> <xsl:when test="contains($tail, ' ')"> <xsl:value-of select="substring-before($tail, ' ')"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$tail"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <a href="/link#{$paragraphNumber}"><xsl:text>§</xsl:text><xsl:value-of select="$paragraphNumber"/></a> <xsl:if test="contains($tail, ' ')"> <xsl:call-template name="tokenize"> <xsl:with-param name="text" select="concat(' ', substring-after($tail, ' '))"/> </xsl:call-template> </xsl:if> </xsl:template>
它转变
<root>
<item>text-one §42 text-two §45</item>
<item>§50 text-three</item>
<item>text-four</item>
</root>
进入
<?xml version="1.0" encoding="UTF-8"?>
<root>
<p>
<text>text-one </text>
<a href="/link#42">§42</a>
<text> text-two </text>
<a href="/link#45">§45</a>
</p>
<p>
<a href="/link#50">§50</a>
<text> text-three</text>
</p>
<p>
<text>text-four</text>
</p>
</root>
- 两个模板递归互相呼叫(XSL非常典型(
-
tokenize
模板将基于段落符号的内容分为头和尾部(符号之前/之后( -
buildParagraphAnchor
根据空格再次将尾巴再次分为头和尾巴 - 这样我们就能将块放入正确的元素
- 当段落符号是第一个字符等时,其余的就是特殊处理
因此,它将item
内容分成块,并将零件放入所需的元素中。