문제

Docbook 섹션 노드를 순회하려고 합니다.그 구조는 다음과 같습니다:

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

따라서 sect1에는 내부에 sect2만 있고, sect2에는 내부에 sect3만 있는 식입니다.한 노드 내에 여러 개의 하위 노드를 가질 수도 있습니다.예를 들어 한 sect1 내의 여러 sect2입니다.

프로그래밍 방식으로 루프가 어느 섹션에 있는지 추적하기 위해 카운터를 사용하여 반복적으로 반복합니다.

이번에는 XSLT를 사용하여 이를 반복해야 합니다.따라서 XSLT에서 이와 동등한 방법이나 더 나은 방법이 있습니까?

편집하다:나는 이미 Willie가 제안한 것과 유사한 코드를 가지고 있습니다. 여기에서는 모든 종파 노드(sect1에서 sect5까지)를 지정합니다.종파 노드를 스스로 결정하는 루프를 찾고 있으며 코드를 반복할 필요가 없습니다.나는 Docbook 사양이 최대 5개의 중첩 노드만 허용한다는 것을 알고 있습니다.

도움이 되었습니까?

해결책

주석 중 하나에서 말한 것처럼 {x}에 관계없이 모든 sect{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