我必须处理的示例xml文档可能如下所示
<?xml version="1.0" encoding="UTF-8"?>
<div>
<p>
This is a text with some<damage>wh</damage>at damaged text
</p>
</div>
基本上我需要做的是,创建HTML文本,其中“损坏”部分用跨度表示,并给出附加脚注。 然而,TRICKY部分是脚注索引应出现在单词的末尾。
目前我有以下XSLT
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="p">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="damage">
<xsl:variable name="alphaNumber">
<xsl:number level="any" count="damage"/>
</xsl:variable>
<span class="{name()}" title="damage in paper (2 chars)">
<xsl:apply-templates/>
</span>
<sup>
<xsl:value-of select="$alphaNumber"/>
</sup>
</xsl:template>
此XSLT生成的输出
<p>
This is a text with some<span class="damage" title="damage in paper (2 chars)">wh</span><sup>1</sup>at damaged text
</p>
我目前的解决方案是使用包含后续节点的变量,然后测试它是否以空格开头。 XSLT的修改部分看起来像
<xsl:template match="damage">
<xsl:variable name="nextNode"><xsl:copy-of select="following::node()[1]"></xsl:copy-of> </xsl:variable>
<xsl:variable name="alphaNumber">
<xsl:number level="any" count="damage"/>
</xsl:variable>
<span class="{name()}" title="damage in paper (2 chars)">
<xsl:apply-templates/>
</span>
<xsl:choose>
<xsl:when test="not($nextNode/*) and not(starts-with($nextNode, ' '))">
<xsl:value-of select="substring-before(normalize-space($nextNode),' ')"/>
</xsl:when>
</xsl:choose>
<sup>
<xsl:value-of select="$alphaNumber"/>
</sup>
</xsl:template>
有了这个,我可以测试索引当前是否出现在一个单词的中间,并且我必须实际将varialble的内容添加到输出中,然后才添加带索引的标记。 但是这个解决方案导致了节点的重复片段,我最终得到:
<?xml version="1.0" encoding="UTF-8"?>
<p>
This is a text with some<span class="damage" title="damage in paper (2 chars)">wh</span>at<sup>1</sup>at damaged text
</p>
我的问题是如何使用xslt防止“at”文本部分的重复。在最终的解决方案中,脚注索引不仅限于那个标签,而且可以在各种地方出现。所以这只是一个以简单的方式表明问题的样本。
感谢任何帮助。
答案 0 :(得分:0)
您使用的是XSLT 2.0吗?您尚未显示如何输出damage
元素后面的文本节点,但假设您使用apply-templates
,则应该能够添加具有特定匹配模式的模板,例如
<xsl:template match="text()[preceding-sibling::node()[1][self::damage]] and not(starts-with(., ' '))]">
<xsl:value-of select="replace(., '^\w+', '')"/>
</xsl:template>