将字符串分为不同的元素



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内容分成块,并将零件放入所需的元素中。

相关内容

  • 没有找到相关文章

最新更新