xml - 如何通过分层节点与 XSLT 循环?

标签 xml xslt docbook

我正在尝试遍历 Docbook 部分节点。它们的结构如下:

<sect1>
   <sect2>
      <sect3>
         <sect4>
            <sect5>
            </sect5>
         </sect4>
      </sect3>
   </sect2>
</sect1>

所以 sect1 中只有 sect2,sect2 中只有 sect3,依此类推。我们也可以在一个节点内有多个子节点;例如一个 sect1 中的多个 sect2。

我会以编程方式递归地遍历它们,使用一个计数器来跟踪循环所在的部分。

这次我必须使用 XSLT 并循环遍历它。因此,在 XSLT 中是否有等效或更好的方法来执行此操作?

编辑:我已经有了 Willie 建议的类似代码,我在其中指定了每个教派节点(sect1 到 sect5)。我正在寻找解决方案,它循环自行确定教派节点,而我不必重复代码。我知道 Docbook 规范只允许最多 5 个嵌套节点。

最佳答案

如果您对所有 sect{x} 节点执行相同的处理,而不管 {x},正如您在其中一条评论中所说,那么以下内容就足够了:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match=
     "sect1|sect2|sect3|sect4|sect5">
      <!-- Some processing here -->
      <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

如果您确实需要以相同的方式处理更多具有“sect”{x} 形式的不同名称的元素(假设 x 在 [1, 100] 范围内),则可以使用以下内容:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match=
     "*[starts-with(name(), 'sect')
      and
        substring-after(name(), 'sect') >= 1
      and
        not(substring-after(name(), 'sect') > 101)
       ]">
      <!-- Some processing here -->
      <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

关于xml - 如何通过分层节点与 XSLT 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/656871/

相关文章:

javascript - 如何将下一个上一个按钮添加到弹出窗口?

xslt: 之前的子字符串

xml - XSLT 1.0 (xsltproc) - 无法解析巨大的 XML

xml - 使用预先创建的 PDF 页面作为书籍封面

XML 到 TeX 或如何从类似 XHTML 的源中获取漂亮的 PDF

android - 抽屉导航用另一个有问题的保留抽屉选项的 fragment 替换 fragment

尝试解析 XML 文件时 Java 内存不足

xml - 哪个浏览器可以显示经过 XSLT 转换的 XML 数据?

xml - Docbook XML 到 PDF,没有 'ő' 和 'ű' 字符

c# - C# 中带有属性的可空元素的 XML 序列化