使用xslt向元素和子节点添加名称空间前缀

使用xslt向元素和子节点添加名称空间前缀,xslt,xslt-1.0,xslt-2.0,Xslt,Xslt 1.0,Xslt 2.0,我只想复制包含所有子节点的头元素,并向每个子节点添加前缀“v11”(包括头元素) 源xml: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns3:createReservationRequest xmlns:ns3="ns3URL" xmlns:ns2="ns2URL"> <heade

我只想复制包含所有子节点的头元素,并向每个子节点添加前缀“v11”(包括头元素)

源xml:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <ns3:createReservationRequest xmlns:ns3="ns3URL" xmlns:ns2="ns2URL">
            <header>
                <language isoCountryCode="US" isoLanguageCode="en"/>
                <channel name="DT">
                    <subChannel name="WEBWB">
                        <subChannel name="WEBWB">
                            <subChannel name="Functester">
                                <subChannel name="ecom"/>
                            </subChannel>
                        </subChannel>
                    </subChannel>
                </channel>
            </header>
            <ns3:agentInfo>
                <ns2:agentDutyCode>PR</ns2:agentDutyCode>
            </ns3:agentInfo>
        </ns3:createReservationRequest>
    </soap:Body>
</soap:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:v1="v1URL"
              xmlns:v11="v11URL">
    <soapenv:Body>
        <v1:createBookerEventRequest>
            <v11:header>
                <v11:channel name="DT">
                    <v11:subChannel name="WEBWB">
                        <v11:subChannel name="WEBWB">
                            <v11:subChannel name="Functester">
                                <v11:subChannel name="ecom"/>
                            </v11:subChannel>
                        </v11:subChannel>
                    </v11:subChannel>
                </v11:channel>
            </v11:header>
        </v1:createBookerEventRequest>
    </soapenv:Body>
</soapenv:Envelope>

公共关系
所需结果xml:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <ns3:createReservationRequest xmlns:ns3="ns3URL" xmlns:ns2="ns2URL">
            <header>
                <language isoCountryCode="US" isoLanguageCode="en"/>
                <channel name="DT">
                    <subChannel name="WEBWB">
                        <subChannel name="WEBWB">
                            <subChannel name="Functester">
                                <subChannel name="ecom"/>
                            </subChannel>
                        </subChannel>
                    </subChannel>
                </channel>
            </header>
            <ns3:agentInfo>
                <ns2:agentDutyCode>PR</ns2:agentDutyCode>
            </ns3:agentInfo>
        </ns3:createReservationRequest>
    </soap:Body>
</soap:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:v1="v1URL"
              xmlns:v11="v11URL">
    <soapenv:Body>
        <v1:createBookerEventRequest>
            <v11:header>
                <v11:channel name="DT">
                    <v11:subChannel name="WEBWB">
                        <v11:subChannel name="WEBWB">
                            <v11:subChannel name="Functester">
                                <v11:subChannel name="ecom"/>
                            </v11:subChannel>
                        </v11:subChannel>
                    </v11:subChannel>
                </v11:channel>
            </v11:header>
        </v1:createBookerEventRequest>
    </soapenv:Body>
</soapenv:Envelope>

我已经尝试使用来自的示例来实现此功能。我编写了以下xsl:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
            xmlns:v11="v11URL">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/">
        <xsl:copy>
            <xsl:apply-templates select="//*[local-name()='header']/*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="//*[local-name()='header']/*">
        <xsl:element name="v11:{name()}" inherit-namespaces="no">
            <xsl:apply-templates select="node()|@*"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

但它不会将子通道复制到结果xml中。还添加了不需要的“xmlns:v11=”http://example.com/schema/common/ATPCommonServiceTypes/v1“标题子节点的属性。欢迎提供任何帮助

以下是我(编辑)的建议:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
            xmlns:v1="v1URL"
            xmlns:v11="v11URL"
            xmlns:ns3="ns3URL"
            exclude-result-prefixes="soap ns3">

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

<xsl:template match="/*">
  <xsl:copy>
    <xsl:copy-of select="document('')/xsl:stylesheet/namespace::*[local-name() = ('v1', 'v11')]"/>
    <xsl:apply-templates select="@* , node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="*[not(namespace-uri())]">
  <xsl:element name="v11:{local-name()}">
    <xsl:apply-templates select="@* , node()"/>
  </xsl:element>
</xsl:template>

<xsl:template match="ns3:createReservationRequest">
  <v1:createBookerEventRequest>
    <xsl:apply-templates select="@* , node()"/>
  </v1:createBookerEventRequest>
</xsl:template>

<xsl:template match="ns3:agentInfo"/>

</xsl:stylesheet>

以下是我(编辑)的建议:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
            xmlns:v1="v1URL"
            xmlns:v11="v11URL"
            xmlns:ns3="ns3URL"
            exclude-result-prefixes="soap ns3">

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

<xsl:template match="/*">
  <xsl:copy>
    <xsl:copy-of select="document('')/xsl:stylesheet/namespace::*[local-name() = ('v1', 'v11')]"/>
    <xsl:apply-templates select="@* , node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="*[not(namespace-uri())]">
  <xsl:element name="v11:{local-name()}">
    <xsl:apply-templates select="@* , node()"/>
  </xsl:element>
</xsl:template>

<xsl:template match="ns3:createReservationRequest">
  <v1:createBookerEventRequest>
    <xsl:apply-templates select="@* , node()"/>
  </v1:createBookerEventRequest>
</xsl:template>

<xsl:template match="ns3:agentInfo"/>

</xsl:stylesheet>

我在
agentDutyCode
中添加了
xmlns
声明,因为它缺少命名空间声明:

<ns2:agentDutyCode xmlns:ns2="ns2URL">PR</ns2:agentDutyCode>
PR
将源代码与此样式表一起使用(注释中解释的模板):


您将得到以下结果:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <v1:createBookerEventRequest xmlns:v11="v11URL" xmlns:v1="v1URL">
         <v11:header>
            <v11:channel name="DT">
               <v11:subChannel name="WEBWB">
                  <v11:subChannel name="WEBWB">
                     <v11:subChannel name="Functester">
                        <v11:subChannel name="ecom"/>
                     </v11:subChannel>
                  </v11:subChannel>
               </v11:subChannel>
            </v11:channel>
         </v11:header>
      </v1:createBookerEventRequest>
   </soap:Body>
</soap:Envelope>


这里是一个可以看到结果的

我在
agentDutyCode
中添加了一个
xmlns
声明,因为它缺少一个命名空间声明:

<ns2:agentDutyCode xmlns:ns2="ns2URL">PR</ns2:agentDutyCode>
PR
将源代码与此样式表一起使用(注释中解释的模板):


您将得到以下结果:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <v1:createBookerEventRequest xmlns:v11="v11URL" xmlns:v1="v1URL">
         <v11:header>
            <v11:channel name="DT">
               <v11:subChannel name="WEBWB">
                  <v11:subChannel name="WEBWB">
                     <v11:subChannel name="Functester">
                        <v11:subChannel name="ecom"/>
                     </v11:subChannel>
                  </v11:subChannel>
               </v11:subChannel>
            </v11:channel>
         </v11:header>
      </v1:createBookerEventRequest>
   </soap:Body>
</soap:Envelope>


这里是一个可以看到结果的地方。

请发布一个命名空间格式良好的XML输入示例,当前
ns2:agentDutyCode
有一个未声明的前缀。根元素未关闭。请发布一个命名空间格式良好的XML输入示例,当前
ns2:agentDutyCode
有一个未声明的前缀未声明。并且根元素未关闭。