XSL - 如何匹配或选择空元素以插入生成的内容

T·卡拉诺

我正在使用 XSLT 将 XML 文件转换为 HTML。部分转换包括输出导航栏。我有一些代码遍历树并获取每个部分的标题并将其作为列表项输出。但是,某些类型的部分是空的并且是完全生成的。当这些部分出现时,我需要能够在导航栏中插入一个默认标题。我正在使用xsl:choose插入标题,但我无法找到匹配空元素的方法。

我查看了此处提到的其他解决方案,包括测试my-empty-element[. = '']my-empty-element[not(text())],但这些对我不起作用。我的 XML 文档的简化版本:

<book>
  <section id="s1">
    <title>Section 1 Title</title>
    <!-- Other stuff here -->
  </section>
  <section-empty id="s2"/> <!-- My generated section -->
  <section id="s3">
    <title>Section 3 Title</title>
    <!-- Other stuff here -->
  </section>
</book>

编辑添加进一步解释:在本书的常规处理过程中,每个部分都被分解成一个单独的文件。在处理每个部分时,我包含<xsl:call-template name="navbar"/>了导航栏,因此实际上从该部分调用了导航栏。

确认一下,空白部分的名称与常规部分的名称不同。这是我的 XSL 的简化版本:

<xsl:template name="navbar">
<!-- I call this template in at the location of the navbar in my HTML document -->
  <xsl:apply-templates select="/book" mode="nav"/>
</xsl:template>
<xsl:template match="/book" mode="nav">
  <nav class="mainnav"><ul>
    <xsl:apply-templates select="section | section-empty" mode="nav"/>
  </ul></nav>
</xsl:template>

<xsl:template match="section | section-empty" mode="nav">
  <li><a>
    <xsl:attribute name="id"><xsl:value-of select="./@id"/></xsl.attribute>
    <xsl:choose>
      <xsl:when test="self::section"><xsl:value-of select="./title/text()"/></xsl:when>
      <xsl:when test="self::section-empty"><xsl:text>Generated Title</xsl:text></xsl:when>
      <xsl:otherwise/>
    </xsl:choose>
  </a></li>
</xsl:template>

我也尝试创建一个单独的模板来匹配,book/section-empty[.='']但这没有任何区别。我当前的输出如下所示:

<nav><ul>
  <li><a href="s1">Section 1 Title</a></li>
  <li><a href="s3">Section 3 Title</a></li>
</ul</nav>

我感谢任何人可以提供的任何帮助。

编辑以<xsl:attribute name="id">在原始示例中包含关闭标记

T·卡拉诺

我的问题是模板匹配中元素名称的拼写错误。我有一个大写字母,小写字母应该是。在检查我的代码时我错过了它。Martin Honnen 确认我的代码应该可以工作,并鼓励使用更好的示例进行故障排除,这帮助我找到了我的错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章