Как сбросить нумерацию списка в xslt - PullRequest
0 голосов
/ 08 января 2019

У меня есть XML-файл:

<ul class="ul">
<li class="li">UL LI 1</li>
<li class="li">UL LI 2</li>
<li class="li">UL LI 3
    <ol class="ol">
        <li class="li">OL LI 1</li>
        <li class="li">OL LI 2
            <ul>
                <li class="li">UL LI 1</li>
                <li class="li">UL LI 2
                    <ol class="ol">
                        <li class="li">OL LI 1</li>
                        <li class="li">OL LI 2
                            <ol class="ol">
                                <li class="li">OL LI 1</li>
                                <li class="li">OL LI 2</li>
                                <li class="li">OL LI 3</li>
                            </ol>
                        </li>
                    </ol>
                </li>
            </ul>
        </li>
    </ol>
</li>

То, чего я хочу достичь, это что-то вроде этого:

  • UL LI 1
  • UL LI 2
  • UL LI 3

    1. OL LI 1
    2. OL LI 2

      • UL LI 1
      • UL LI 2

        1. OL LI 1
        2. OL LI 2

          2,1 OL LI 1

          2,2 OL LI 2

          2,3 OL LI 3

Если родителем ol является ul, я хочу сбросить нумерацию, в противном случае нумерация должна быть унаследована от ее родителя. Как я могу сделать это в xslt?

Я попытался решить эту проблему с помощью этого кода:

                  <xsl:variable name="ol.parent" select="parent::*/parent::*/parent::*[contains(@class, ' ol ')]"/>

              <xsl:choose>
                <xsl:when test="not(empty($ol.parent))">
                  <xsl:number level="multiple" select="$ol.parent/ancestor-or-self::*[contains(@class, ' ol ')]" count="*[contains(@class, ' li ')]" format="1."/>
                </xsl:when>
                <xsl:otherwise>
                  <xsl:number level="multiple"  from="*[(contains(@class, ' ol ') or contains(@class, ' li '))]" format="1."/>
                </xsl:otherwise>
              </xsl:choose>

Но упорядоченный список не наследует многоуровневый номер. Всегда начинается с единицы.

1 Ответ

0 голосов
/ 08 января 2019

Я думаю, вы можете использовать <xsl:number format="1." level="multiple" from="ul/li/ol"/> в контексте match="ol/li", например. https://xsltfiddle.liberty -development.net / ncdD7kN

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:template match="ol/li">
      <xsl:copy>
          <xsl:number format="1." level="multiple" from="ul/li/ol"/>
          <xsl:apply-templates/>
      </xsl:copy>
  </xsl:template> 

</xsl:stylesheet>

выходы

<ul class="ul">

   <li class="li">UL LI 1</li>

   <li class="li">UL LI 2</li>

   <li class="li">UL LI 3

      <ol class="ol">

         <li>1.OL LI 1</li>

         <li>2.OL LI 2

            <ul>

               <li class="li">UL LI 1</li>

               <li class="li">UL LI 2

                  <ol class="ol">

                     <li>1.OL LI 1</li>

                     <li>2.OL LI 2

                        <ol class="ol">

                           <li>2.1.OL LI 1</li>

                           <li>2.2.OL LI 2</li>

                           <li>2.3.OL LI 3</li>

                        </ol>

                     </li>

                  </ol>

               </li>

            </ul>

         </li>

      </ol>

   </li>

</ul>

Конечно, использование xsl:number остается прежним, если вместо приведенного выше простого и быстрого теста XSLT 3 с выводом HTML вы вместо этого используете XSLT 2 и создаете XSL-FO вместо HTML: https://xsltfiddle.liberty -development .net / ncdD7kN / 1 .

...