Как зациклить с XSLT через иерархические узлы?

StackOverflow https://stackoverflow.com/questions/656871

  •  19-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь пройтись по узлам раздела 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top