如何在XSLT中重置列表编号

时间:2019-01-08 09:03:15

标签: xml xslt xslt-2.0 xsl-fo

我有一个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 :(得分:0)

我认为您可以在<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>

当然,如果您使用XSLT 2并创建XSL-FO而不是HTML:https://xsltfiddle.liberty-development.net/ncdD7kN/1来代替上述简单且快速的带有HTML输出的XSLT 3测试用例,则xsl:number的用法保持不变。