3

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

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

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

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

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

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

4

2 回答 2

4

如果您对所有 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>
于 2009-03-18T04:24:52.597 回答
0
<xsl:template match="sect1">
    <!-- Do stuff -->
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="sect2">
    <!-- Do stuff -->
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="sect3">
    <!-- Do stuff -->
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="sect4">
    <!-- Do stuff -->
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="sect5">
    <!-- Do stuff -->
    <xsl:apply-templates />
</xsl:template>
于 2009-03-18T03:34:22.950 回答