1

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

4

1 回答 1

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元素的第一个兄弟。

于 2012-11-09T03:49:33.413 回答