【问题标题】:How to reset list numbering in xslt如何在 xslt 中重置列表编号
【发布时间】:2019-01-08 09:03:15
【问题描述】:

我有一个 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李1
    2. OL李2

      • UL LI 1
      • UL LI 2

        1. OL李1
        2. OL李2

          2.1 OL李1

          2.2 OL李2

          2.3 OL李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>

但是有序列表不继承多级数。它总是从一个开始。

【问题讨论】:

  • 如果代码使用了只存在于 XSLT/XPath 2 及更高版本中的 empty 函数,为什么它会被标记为 [xslt-1.0]?
  • @MartinHonnen,谢谢..修复它。
  • @NikkuKahel 批准的解决方案和相关的 cmets 显然有效。我只是有一个相关的问题:层次结构有 OL 和 UL,我只在接受的答案中看到 OL 的规则。可能我可以看到完整的 xsl 显示如何为整个列表(OL 和 UL)生成编号?

标签: xml xslt xslt-2.0 xsl-fo


【解决方案1】:

我认为您可以在 match="ol/li" 的上下文中使用 &lt;xsl:number format="1." level="multiple" from="ul/li/ol"/&gt;,例如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 的使用保持不变,如果不是上面带有 HTML 输出的简单快速的 XSLT 3 测试用例,而是使用 XSLT 2 并创建 XSL-FO 而不是 HTML:https://xsltfiddle.liberty-development.net/ncdD7kN/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多