我有一些像这样的XML:
<subsection number="5">
<p>
(5) The <link path="123">Secretary of State</link> shall appoint such as....
</p>
</subsection>
我无法更改XML,我需要删除段落开头的(5)并使用parent标记中的number属性创建一个带有适当标记的新段落编号:
<xsl:template match="subsection/p">
<xsl:variable name="number">
<xsl:text>(</xsl:text>
<xsl:value-of select="../@number"/>
<xsl:text>)</xsl:text>
</xsl:variable>
<xsl:variable name="copy">
<xsl:value-of select="."/>
</xsl:variable>
<p>
<span class="indent">
<xsl:value-of select="$number" />
</span>
<span class="copy">
<xsl:value-of select="substring-after($copy, $number)" />
</span>
</p>
</xsl:template>
问题是段落的其余部分可能包含更多需要转换的XML,例如示例中的链接标记。
一旦我使用了substring-after函数,我不知道如何应用模板。
答案 0 :(得分:1)
明确的方法是将subsection/p
元素的第一个文本子元素与所有其他子元素分开处理。出于演示目的,我还添加了一个模板,用于将link
元素转换为a
元素。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="subsection/p/text()[1]">
<xsl:value-of select="concat('(', ../../@number, ')')"/>
</xsl:template>
<xsl:template match="subsection/p">
<p>
<span class="indent">
<xsl:apply-templates select="text()[1]"/>
</span>
<span class="copy">
<xsl:apply-templates select="*|text()[not(position()=1)]"/>
</span>
</p>
</xsl:template>
<xsl:template match="subsection/p/link">
<a href="{@path}"><xsl:value-of select="."/></a>
</xsl:template>
</xsl:stylesheet>
此样式表产生以下输出:
<p><span class="indent">(5)</span><span class="copy">
<a href="123">Secretary of State</a>shall appoint such as....</span></p>