什么会导致<span></span><span></span><span></span>
转换为<span><span><span></span></span></span>
,但不会转换为<span>a</span><span>a</span><span>a</span>
?
答案 0 :(得分:1)
使用强>:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()[1]|@*"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="span[not(node())]">
<span>
<xsl:apply-templates select="following-sibling::*[1][self::span[not(node())]]"/>
</span>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下文档(提供的片段,包装到单个顶部元素中 - 构成格式良好的XML文档):
<p>
<span></span><span></span><span></span>
</p
产生了想要的正确结果:
<p>
<span>
<span>
<span/>
</span>
</span>
</p>
另外,根据需要,如果我们将相同的转换(上面)应用于此XML文档:
<p>
<span>a</span><span>a</span><span>a</span>
<span></span><span></span><span></span>
</p>
结果会保留“原样”具有子节点的span
元素:
<p>
<span>a</span>
<span>a</span>
<span>a</span>
<span>
<span>
<span/>
</span>
</span>
</p>
<强>解释强>:
我们使用“细粒度”身份规则,该规则“按原样”复制每个节点,并且只在一个步骤中执行此操作。
有一个模板可以覆盖没有子节点的任何span
元素的细粒度标识模板。它重新创建元素并处理第一个兄弟,它也是一个空的span
元素。