在节点集中复制元素

Copying elements inside nodeset

我想从节点集中复制元素并在输出中构建它们,如图所示。

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

与您在此处收到的答案相同:

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

例如:

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>