XSLT组父级

时间:2014-08-07 12:06:07

标签: xslt

我是XSLT的新手。我需要从xml / xsl transform

获得以下结果
<root>
<abc>
    <aaa></aaa>
    <aaa></aaa>
    <aaa></aaa>
    <bbb>
        <ccc></ccc>
    </bbb>
 </abc>
</root>

我希望输出html类似于:

<root>
<abc>
  <ddd>
    <aaa></aaa>
    <aaa></aaa>
    <aaa></aaa>
  </ddd>
  <bbb>
     <ccc></ccc>
  </bbb>
 </abc>
 </root>

请帮忙。感谢

1 个答案:

答案 0 :(得分:2)

如果您确实只是将aaa个元素收集到一个ddd中,那么这在XSLT 1.0和2.0中都很简单。

首先,阅读有关XSLT identity transform的信息,该信息在其副本节点上按原样输出。

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

然后,您只需要要转换的节点的模板。在这种情况下,您将通过添加新子项来转换abc元素。

要将所有aaa元素聚集到一个ddd中,您只需执行此操作

     <ddd>
        <xsl:apply-templates select="aaa" />
     </ddd>

然后要处理其他孩子,只需执行此操作即可选择aaa

以外的所有内容
     <xsl:apply-templates select="node()[not(self::aaa)]" />

试试这个XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="abc">
     <ddd>
        <xsl:apply-templates select="aaa" />
     </ddd>
     <xsl:apply-templates select="node()[not(self::aaa)]" />
  </xsl:template>
</xsl:stylesheet>