我有一个XML文件,其中包含一系列配对,如下所示:
<metamark function="let-stand" spanTo="#meta-93"/>some text between the two empty nodes<anchor xml:id="meta-93"/>
换句话说,文本前面总是带有@ function ='let-stand'的metamark标记和带有唯一值的spanTo。并且文本后面跟着一个锚标记,其@xml:id值与元标记上的@spanTo值匹配。
通过XSLT将此类文本转换为HTML时,我想将其包装在span标记中,如下所示:
<span class="dotted">some text between the two empty nodes</span>
我怎样才能做到这一点?请注意,两个空节点之间的文本始终是兄弟节点。我在span @class上放置的值是任意的。我只是在这里使用“点缀”作为演示目的。
答案 0 :(得分:1)
基本思路是每个metamark
:
创建span
代码,
获取当前metamark
,
作为以下兄弟的anchor
标记带有正确的id
(终点,独占),
并将模板应用于他们。
当然,你必须阻止&#34;正常&#34;模板应用程序位于metamark
标记的父标记内。
尝试以下转换:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" doctype-public="XSLT-compat"
encoding="UTF-8" indent="yes" />
<xsl:template match="metamark">
<xsl:element name="span">
<xsl:attribute name="class" select="'dotted'"/>
<xsl:variable name="termId" select="substring(@spanTo, 2)"/>
<xsl:variable name="srcRange" select="following-sibling::node()
[following-sibling::anchor[@xml:id=$termId]]"/>
<xsl:apply-templates select="$srcRange"/>
</xsl:element>
<xsl:text>
</xsl:text>
</xsl:template>
<!-- In "main" process only "metamark" tags -->
<xsl:template match="main">
<xsl:apply-templates select="metamark"/>
</xsl:template>
<!-- HTML envelope -->
<xsl:template match="/">
<html>
<body>
<xsl:text>
</xsl:text>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<!-- Identity transform -->
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
</xsl:transform>
我尝试了以下XML示例:
<?xml version="1.0" encoding="utf-8"?>
<main>
<metamark function="let-stand" spanTo="#meta-93"/>Aaaaaa bbbbbbb<anchor xml:id="meta-93"/>
<metamark function="let-stand" spanTo="#meta-94"/>Eeeeee <b>bbb</b> ccc<anchor xml:id="meta-94"/>
<metamark function="let-stand" spanTo="#meta-95"/>Ffffff bbbbbbb<anchor xml:id="meta-95"/>
</main>
得到了结果:
<!DOCTYPE html PUBLIC "XSLT-compat">
<html>
<body>
<span class="dotted">Aaaaaa bbbbbbb</span>
<span class="dotted">Eeeeee <b>bbb</b> ccc</span>
<span class="dotted">Ffffff bbbbbbb</span>
</body>
</html>