Как зациклить с XSLT через иерархические узлы?
Вопрос
Я пытаюсь пройтись по узлам раздела Docbook. Их структура выглядит следующим образом:
<sect1>
<sect2>
<sect3>
<sect4>
<sect5>
</sect5>
</sect4>
</sect3>
</sect2>
</sect1>
Таким образом, у sect1 будет только sect2 внутри, у sect2 будет только sect3 внутри, и так далее. Мы также можем иметь несколько подузлов в узле; например, несколько sect2 в пределах sect1.
Программно я бы рекурсивно просматривал их, используя счетчик для отслеживания того, в каком разделе находится цикл. Р>
На этот раз я должен использовать XSLT и перебирать его. Таким образом, существует ли эквивалентный способ или лучший способ сделать это в XSLT?
Редактировать: у меня уже есть подобный код, предложенный Вилли, где я указываю каждый узел секты (с sect1 по sect5). Я ищу решение, в котором он сам определяет узел секты, и мне не придется повторять код. Мне известно, что спецификации Docbook допускают использование до 5 вложенных узлов.
Решение
Если вы выполняете одинаковую обработку для всех узлов секты {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>
Другие советы
<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>