如何在 xslt 中重置列表编号

How to reset list numbering in xslt

我有一个 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>

我想要实现的是这样的:

如果 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 开头。

我认为您可以在 match="ol/li" 的上下文中使用 <xsl:number format="1." level="multiple" from="ul/li/ol"/>,例如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.