我有一个XML文件,其中包含一系列配对,如下所示:
<metamark function="let-stand" spanTo="#meta-93"/>some text between the two empty nodes<anchor xml:id="meta-93"/>
换句话说,文本前面总是有一个带有 @function='let-stand' 的元标记标记和一个具有唯一值的 spanTo。文本后面始终跟着一个锚标记,其 @xml:id 值与元标记上的@spanTo值相匹配。
当通过 XSLT 将此类文本转换为 HTML 时,我想将其包装在 span 标签中,如下所示:
<span class="dotted">some text between the two empty nodes</span>
我怎样才能做到这一点?请注意,两个空节点之间的文本将始终是同级。我对跨度@class的值是任意的。我只是在这里使用"点"进行演示。
基本思想是对于每个metamark
:
-
创建
span
标签, -
获取当前
metamark
的以下兄弟姐妹, -
作为以下兄弟姐妹具有具有适当
id
的标签anchor
(终点,独占), -
并对其应用模板。
当然,您必须在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>