假设我有一个嵌套的HTML列表:
<ul>
<li> First Item </li>
<li> Nested list:
<ol>
<li> One </li>
<li> Two </li>
</ol>
</li>
<li> Third Item </li>
</ul>
是否可以将其展平为逐行表示,其中嵌套深度成为属性值?像这样:
<line nest="1"> First Item </line>
<line nest="1"> Nested list: </line>
<line nest="2"> One </line>
<line nest="2"> Two </line>
<line nest="1"> Third Item </line>
我可以想到一种为深层嵌套列表执行此操作的方法。我所拥有的是以下内容:
<xsl:template match="ol | ul">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="li">
<line>
<xsl:attribute name="nest"><xsl:value-of select="count(ancestor::ol|ancestor::up)" /></xsl:attribute>
<xsl:apply-templates/>
</line>
</xsl:template>
但是这也会嵌套<line>
元素,并且它不会处理列表元素中的<em>
文本之类的其他元素。
答案 0 :(得分:1)
您需要在创建xsl:apply-templates
元素后移动line
,并将其更改为选择非文本节点。在line
元素中,您可以使用xsl:value-of
替换它以获取文本。
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="ol | ul">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="li">
<line nest="{count(ancestor::ol|ancestor::up)}">
<xsl:value-of select="normalize-space(text())"/>
</line>
<xsl:apply-templates select="node()[not(self::text())]" />
</xsl:template>
</xsl:stylesheet>
请注意在创建nest
属性时使用Attribute Value Templates,以简化代码。
答案 1 :(得分:0)
我建议你这样试试:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/ul">
<root>
<xsl:apply-templates/>
</root>
</xsl:template>
<xsl:template match="li">
<line nest="{count(ancestor::ol|ancestor::ul)}">
<xsl:apply-templates select="node()[not(self::ol or self::ul)]"/>
</line>
<xsl:apply-templates select="ol | ul"/>
</xsl:template>
<xsl:template match="ol | ul">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
这将保留您在li
元素中可能包含的任何HTML标记。