我正在尝试遍历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个嵌套节点。
答案 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>