【发布时间】:2011-10-17 02:15:22
【问题描述】:
假设一个标签和项目对的 XML 树,每个都包含需要转换的标记:
<list>
<label>ABC<ptr target="#note-1"/></label>
<item><ref type="link">123</ref></item>
<label>DEF<ptr target="#note-2"/></label>
<item><ref type="link">456</ref></item>
...
</list>
(注意,<label> 和 <item> 元素内的标记只是一个示例。这些元素中可能包含任意数量的标记。因此,将处理嵌套标记通过模板规则。使用 XSL 字符串函数等来处理这种嵌套标记并不是一个理想的解决方案,因为可能的标记数量很大。)
假设目标是将其转换为 HTML 无序列表,如下所示:
<ul>
<li>ABC<sup>1</sup> <a href="link1.html">123</a></li>
<li>DEF<sup>2</sup> <a href="link2.html">456</a></li>
...
</ul>
我一直在尝试将 <label><item> 节点对与前面的::sibling 轴匹配,例如
<xsl:template match="list[@type='index']/item[preceding-sibling::label]" >
<li><xsl:value-of select="./preceding-sibling::label[1]"/> <xsl:apply-templates/></li>
</xsl:template>
但我的输出两次发出<label> 的内容:一次在<li> 元素之前(正确转换),另一次在<li> 元素内部(没有转换),如下所示:
<ul>
ABC<sup>1</sup>
<li>ABC <a href="link1.html">123</a></li>
DEF<sup>2</sup>
<li>DEF <a href="link2.html">456</a></li>
...
</ul>
我了解<li> 中的<label> 内容没有被转换,因为我使用的是<xsl:value-of>。我只是想说明我想要实现的目标,即在<li> 中获取<label> 和 <item> 的内容。
如果我添加以下模板来抑制来自 <label> 元素的第二个内容实例:
<xsl:template match="list[@type='index']/label"></xsl:template>
然后删除来自<label> 的冗余内容集,但不是正确的内容。例如,
<ul>
<li>ABC <a href="link1.html">123</a></li>
<li>DEF <a href="link2.html">456</a></li>
...
</ul>
所以,我的问题是,如何将 <label> 和 <item> 中的内容放入单个 <li> 元素中,同时让样式表中的其他模板处理该内容?
【问题讨论】:
标签: xslt