空跨兄弟成为前辈

时间:2012-11-08 20:26:47

标签: xml xslt

什么会导致<span></span><span></span><span></span>转换为<span><span><span></span></span></span>,但不会转换为<span>a</span><span>a</span><span>a</span>

1 个答案:

答案 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>

<强>解释

  1. 我们使用“细粒度”身份规则,该规则“按原样”复制每个节点,并且只在一个步骤中执行此操作。

  2. 有一个模板可以覆盖没有子节点的任何span元素的细粒度标识模板。它重新创建元素并处理第一个兄弟,它也是一个空的span元素。