我有一些如下所示的 XML:
<doc>
<elem>
Some text, <i class="i">including HTML markup</i>
<item value="1">
Some more text, <i>including HTML markup</i>
</item>
<item value="2">
Yet more text, <i>including HTML markup</i>
</item>
</elem>
</doc>
我想将其转换为 HTML,其中包含
<elem>
标签内容的有序列表,后跟 <item>
元素内容的项目符号列表,如下所示:
<ol>
<li>
Some text, <i class="i">including HTML markup</i>
<ul>
<li>Some more text, <i>including HTML markup</i></li>
<li>Yet more text, <i>including HTML markup</i></li>
</ul>
</li>
</ol>
我的 XSLT 样式表如下所示:
<?xml version='1.0'?>
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
<xsl:template match='doc'>
<ol>
<xsl:apply-templates select='elem'/>
</ol>
</xsl:template>
<xsl:template match='elem'>
<li>
<xsl:apply-templates select='*[not(elem|item)]|text()'/>
<ul>
<xsl:apply-templates select='item'/>
</ul>
</li>
</xsl:template>
<xsl:template match='item'>
<li>
<xsl:apply-templates/>
</ul>
</li>
</xsl:template>
<xsl:template match="*[not(elem|item)]|text()">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这是结果:
<ol>
<li>
Some text, <i>including HTML markup</i>
<li>
Some more text, <i>including HTML markup</i>
</li>
<li>
Yet more text, <i>including HTML markup</i>
</li>
<ul>
<li>
Some more text, <i>including HTML markup</i>
</li>
<li>
Yet more text, <i>including HTML markup</i>
</li>
</ul>
</li>
</ol>
尽管
not(elem|item)
的规则中有选择器 elem
,但它在生成 item
标签之前应用了 <ul>
的模板,并且丢失了 class
标签上的 <i>
属性。
我在这里做错了什么?
表情
<xsl:apply-templates select='*[not(elem|item)]|text()'/>
没有做你认为的那样。
我怀疑您想要做的是处理除
elem
和 item
子元素之外的所有子元素和文本节点(尽管在您的示例中除了 item
之外没有任何子元素)。如果这是您的意图,您可以这样做*[not(self::elem or self::item)]
。您的表达式实际上所做的是选择没有名为 elem
或 item
的子元素的所有子元素。