如何在 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>
我想要实现的是这样的:
- UL LI 1
- UL LI 2
UL LI 3
- OL 李 1
OL李2
- UL LI 1
UL LI 2
- OL 李 1
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>
但是有序列表不继承多级数。它总是以 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.
我有一个 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
- OL 李 1
OL李2
- UL LI 1
UL LI 2
- OL 李 1
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>
但是有序列表不继承多级数。它总是以 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.