复制节点集内的元素

时间:2015-02-21 01:38:56

标签: xml xslt

我想从节点集内部复制元素,并在输出中将它们组织起来,如图所示。

<Details>
<ContractType>
<ID>001</ID>
<Name>
<FirstName>Mano</FirstName>
<Initial>1</Initial>
</Name>
</ContractType>
</Details>

输出:

<PartyDetails>
<ID>001</ID>
<Name>
<FirstName>Mano</FirstName>
<Initial>1</Initial>
</Name>
</PartyDetails>

在我试过的XSLT的片段下面,它并没有按照我的需要实际复制元素。我需要做什么改变来剥离ContractType并重命名Details,如输出中所示。

    <xsl:template match="ContractType">
    <xsl:element name="PartyDetails">
     <xsl:apply-templates select="@*|node()"/>
      </xsl:element>
       </xsl:template>

1 个答案:

答案 0 :(得分:2)

与您在此处收到的答案相同:Renaming node in XML

如果您已开始使用身份转换模板,那么您的默认行为是按原样复制所有 。然后,您需要为需要以任何方式修改 的任何节点添加例外规则。

例如:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<!-- rename Details -->
<xsl:template match="Details">
    <PartyDetails>
        <xsl:apply-templates select="@*|node()"/>
    </PartyDetails>
</xsl:template>

<!-- remove ContractType wrapper-->
<xsl:template match="ContractType">
    <xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>

应用于您的示例,结果为:

<?xml version="1.0" encoding="UTF-8"?>
<PartyDetails>
  <ID>001</ID>
  <Name>
    <FirstName>Mano</FirstName>
    <Initial>1</Initial>
  </Name>
</PartyDetails>