Иерархическая нумерация плоского XML с помощью XSLT? - PullRequest
0 голосов
/ 12 мая 2018

У меня есть плоский XML-документ, который я хочу нумеровать. Это вообще возможно - с <xsl:number ... count=''>?

XML-источник (частично и упрощенно)

<modul>
  <p>
  <h1>A Heading
  <p>
  <figure>
    <img>
  <h2>A Heading
  <p>
  <h1>A Heading
  <p>
  <h2>A Heading
  <p>
  <h3>A Heading
  <p>
<modul>

Желаемый вывод (html)

<html>
      <p>
      <h1>1. A Heading
      <p>
      <figure>
        <img>
      <h2>1.2 A Heading
      <p>
      <h1>2. A Heading
      <p>
      <h2>2.1 A Heading
      <p>
      <h3>2.1.1 A Heading
      <p>
</html>

Таблица стилей (часть)

  <xsl:template match="h1">
            <h1>
            <xsl:number count="h1"/>
                <xsl:text>. </xsl:text>
                <xsl:apply-templates/>
            </h1>
     </xsl:template>

     <xsl:template match="h2">
            <h2>
                <xsl:number count="h1 | h2" level="multiple" format="1.1.1."/>  
                <xsl:apply-templates/>  
            </h2>
     </xsl:template> 

Я могу нумеровать все элементы h1 и h2, но я получаю непрерывную нумерацию (все h-элементы пронумерованы непрерывно). Я не могу понять, как получить элементы h2 / h3 на следующем уровне. Возможна ли здесь вообще иерархическая нумерация?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018
<xsl:template match="@*|node()">
       <xsl:copy>
           <xsl:apply-templates select="@*"/>
       </xsl:copy>
   </xsl:template>
    <xsl:template match="modul">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="p">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="figure">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="img">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="h1">
        <xsl:copy>
            <xsl:number count="h1" level="any" format="1"/>
            <xsl:text>. </xsl:text>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="h2">
        <xsl:copy>
            <xsl:number count="h1" level="any" format="1"/>
            <xsl:text>.</xsl:text>
            <xsl:number from="h1" count="h2" level="any"/>
            <xsl:text> </xsl:text>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="h3">
        <xsl:copy>
            <xsl:number count="h1" level="any" format="1"/>
            <xsl:text>.</xsl:text>
            <xsl:number from="h1" count="h2" level="any"/>
            <xsl:text>.</xsl:text>
            <xsl:number from="h2" count="h3" level="any"/>
            <xsl:text> </xsl:text>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

Попробуйте это

0 голосов
/ 13 мая 2018

Я не думаю, что вы можете достичь этого с помощью level = "multiple".

Я думаю, что вы можете получить необходимое число для (скажем) элемента h3, используя

<xsl:template match="h3" mode="number">
  <xsl:number level="any" count="h1"/>
  <xsl:text>.</xsl:text>
  <xsl:number level="any" count="h2" from="h1"/>
  <xsl:text>.</xsl:text>
  <xsl:number level="any" count="h3" from="h2"/>
</xsl:template>

и затем вы можете определить аналогичные правила шаблона для других уровней и получить номер уровня для раздела, используя <xsl:apply-templates select="." mode="number"/>.

Несколько предостережений: (a) я не проверял это, и (b) правила для xsl:number в XSLT 1.0 оставляют некоторые случаи недоопределенными, и известно, что различные реализации XSLT 1.0 интерпретировали правила по-разному. Правила в XSLT 2.0 намного более точны, и в некоторых крайних случаях дают результаты, которые отличаются от (некоторые чтения) спецификации 1.0.

Возможно, что использование CSS для нумерации может обеспечить альтернативное решение.

Другой подход заключается в использовании позиционной группировки для преобразования плоской структуры в структуру вложенных секций HTML5, и в этом случае level = "множественный" решает проблему нумерации.

...