在xslt中嵌套节点

时间:2013-01-26 15:35:44

标签: xml xslt nested

我正在尝试创建一个XSLT来转换XML文档,但我在分组方面遇到了麻烦。我没有问题为单个对象提取信息,但我不知道如何使用xslt对某些元素进行分组。我尝试过xsl:for-each-group和xsl:key进行分组,但我在转换方面没有成功。

输入:

<?xml version="1.0" standalone="yes"?>
<root>
    <node1>
        <ID>2</ID>
        <Name>ABCDE</Name>
        <Age>21</Age>
        <Skills>C++ C#</Skills>
        <worklocation>IN</worklocation>
        <designaton>Engineer I</designaton>
    </node1>
    <node2>
        <ID>3</ID>
        <Name>EFGH</Name>
        <Age>12</Age>
        <Skills>java</Skills>
        <worklocation>USA</worklocation>
        <designaton>Engineer II</designaton>
    </node2>
</root>

期望输出:

<root>
    <node1>
        <ID>2</ID>
        <Name>ABCDE</Name>
        <Age>21</Age>
        <workInfo>
            <Skills>C++ C#</Skills>
            <worklocation>IN</worklocation>
            <designaton>Engineer I</designaton>
        </workInfo>
    </node1>
    <node2>
        <ID>3</ID>
        <Name>EFGH</Name>
        <Age>12</Age>
        <workInfo>
            <Skills>java</Skills>
            <worklocation>USA</worklocation>
            <designaton>Engineer II</designaton>
        </workInfo>
    </node2>
</root>

1 个答案:

答案 0 :(得分:2)

使用身份模板:请参阅W3C recommandation

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

然后应用与root节点的每个子节点匹配的特定模板,并将动态创建workInfo节点。

<xsl:template match="/root/*">
  <xsl:apply-templates select="ID|Name|Age" />
  <workInfo>
    <xsl:apply-templates select="Skills|worklocation|designaton" />
  </workInfo>
</xsl:template>