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

时间:2017-01-15 23:00:39

标签: html xml xslt

我有一个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上放置的值是任意的。我只是在这里使用“点缀”作为演示目的。

1 个答案:

答案 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>&#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>