添加名称空间前缀的XSLT转换不会复制属性

时间:2019-07-17 11:29:32

标签: xslt

我需要为所有xml元素添加一个名称空间前缀。 我为此有一个工作的xslt,但是不幸的是它没有复制属性。我还需要更改以复制这些属性。

这是我的代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:ns0="http://ns.hr-xml.org/2007-04-15"     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />

<xsl:template match="*">
<xsl:element name="ns0:{local-name()}">
<xsl:apply-templates select="*|node()" />
</xsl:element>
</xsl:template>

</xsl:stylesheet>

输入的XML是这样的:

      <HumanResource schemaLocation="http://ns.hr-xml.org/2007-04-15 ../HumanResource.xsd">               
     <HumanResourceId idOwner="StaffingCompany">
        <IdValue>123COMP</IdValue>
     </HumanResourceId>
     <HumanResourceId idOwner="StaffingCustomer">
        <IdValue>456CUST</IdValue>
        <!--double hre-id, due fms wnr-code swap-->
     </HumanResourceId>
     <HumanResourceStatus status="x:Assigned"/>
     <ReferenceInformation>
        <StaffingSupplierId idOwner="StaffingCustomer">
           <IdValue>105964</IdValue>
        </StaffingSupplierId>
        <StaffingCustomerId idOwner="StaffingCompany">
           <IdValue>MIN0000612</IdValue>
        </StaffingCustomerId>
        <StaffingCustomerId idOwner="StaffingCustomer">
           <IdValue>ELI</IdValue>
        </StaffingCustomerId>
        <StaffingSupplierOrgUnitId idOwner="StaffingCompany">
           <IdValue>2606379</IdValue>
        </StaffingSupplierOrgUnitId>
        <StaffingCustomerOrgUnitId idOwner="StaffingCustomer">
           <IdValue>ELI</IdValue>
        </StaffingCustomerOrgUnitId>
     </ReferenceInformation>
     <ResourceInformation>
        <PersonName>
           <FormattedName>J</FormattedName>
           <LegalName>C</LegalName>
           <GivenName>J</GivenName>
           <PreferredGivenName>J</PreferredGivenName>
           <MiddleName>C.J.</MiddleName>
           <FamilyName primary="true"></FamilyName>
        </PersonName>
        <EntityContactInfo>
           <EntityName></EntityName>
           <PersonName>
              <FormattedName>Liesbeth Kramer</FormattedName>
           </PersonName>
           <ContactMethod>
              <Telephone>
                 <FormattedNumber>070-3102150</FormattedNumber>
              </Telephone>
           </ContactMethod>
        </EntityContactInfo>
        <PostalAddress>
           <CountryCode>NL</CountryCode>
           <PostalCode></PostalCode>
           <Municipality></Municipality>
           <DeliveryAddress>
              <AddressLine></AddressLine>
              <StreetName></StreetName>
              <BuildingNumber></BuildingNumber>
           </DeliveryAddress>
        </PostalAddress>
     </ResourceInformation>
     <Profile/>
     <Preferences/>
     <UserArea>
        <ns2:HumanResourceAdditionalNL xmlns:ns2="http://ns.setu.nl/2008-01">
           <ns2:BirthDate>1961-07-13</ns2:BirthDate>
           <ns2:Sex>female</ns2:Sex>
        </ns2:HumanResourceAdditionalNL>
     </UserArea>
  </HumanResource>

我的代码结果如下:

<?xml version='1.0' ?>
<ns0:HumanResource xmlns:ns0="http://ns.hr-xml.org/2007-04-15">

<ns0:HumanResourceId>

<ns0:IdValue>123COMP</ns0:IdValue>

 </ns0:HumanResourceId>

<ns0:HumanResourceId>

  <ns0:IdValue>456CUST</ns0:IdValue>


</ns0:HumanResourceId>

<ns0:HumanResourceStatus/>

<ns0:ReferenceInformation>

如您所见,ns0:添加成功,但我丢失了属性。

1 个答案:

答案 0 :(得分:0)

您丢失了属性,因为您没有代码选择它们。当前您执行<xsl:apply-templates select="*|node()" />,但是*选择元素,而node()选择元素,文本节点,注释和处理指令。您需要将其更改为此...

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

然后,您将需要一个单独的模板来匹配属性并复制它们。

<xsl:template match="@*">
  <xsl:copy />
</xsl:template>

尝试使用此XSLT

<xsl:stylesheet version="1.0" xmlns:ns0="http://ns.hr-xml.org/2007-04-15"     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />

<xsl:template match="*">
  <xsl:element name="ns0:{local-name()}">
    <xsl:apply-templates select="@*|node()" />
   </xsl:element>
</xsl:template>

<xsl:template match="@*">
  <xsl:copy />
</xsl:template>
</xsl:stylesheet>

或者,您可以使用xsl:copy-of复制属性。也尝试这个XSLT

<xsl:stylesheet version="1.0" xmlns:ns0="http://ns.hr-xml.org/2007-04-15"     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />

<xsl:template match="*">
  <xsl:element name="ns0:{local-name()}">
    <xsl:copy-of select="@*" />
    <xsl:apply-templates  />
   </xsl:element>
</xsl:template>
</xsl:stylesheet>

请注意,<xsl:apply-templates /><xsl:apply-templates select="node()" />的简写