我有一个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 3
OL LI 2
UL LI 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>
但是它的有序列表不会继承多级编号。它总是以一个开头。
答案 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
的用法保持不变。