如何通过分层节点循环使用XSLT?

时间:2009-03-18 03:23:40

标签: xml xslt docbook

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

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

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

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

这次我必须使用XSLT并循环遍历它。那么在XSLT中是否有相同的方法或更好的方法呢?

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>