使用 XSLT 在两个空节点之间跨越文本



我有一个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>&#xA;</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>&#xA;</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>

最新更新