【问题标题】:Using XSLT to span text between two empty nodes使用 XSLT 在两个空节点之间跨越文本
【发布时间】:2017-01-15 23:00:39
【问题描述】:

我有一个包含一系列配对的 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>

我怎样才能做到这一点?请注意,两个空节点之间的文本将始终是兄弟节点。我在 span @class 上设置的值是任意的。我只是在这里使用“dotted”进行演示。

【问题讨论】:

  • 请发布一个更实质性的示例(在上下文中显示了多次出现这种配对),以及预期的输出。如果可以嵌套,也显示出来。

标签: html xml xslt


【解决方案1】:

基本思想是对于每个metamark

  • 创建span标签,

  • 获取当前metamark的以下兄弟姐妹,

  • 作为后续兄弟有anchor标签和正确的id(端点,独占),

  • 并将模板应用到它们。

当然,您必须在 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>

【讨论】:

  • 不错的建议,但这会输出重复的文本。检查此输入。 "

    o 两个空节点之间的一些文本b 文本

    "
猜你喜欢
  • 2018-02-14
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多