将xml转换为没有soapEnvolpe和名称空间的xml,并使用xslt将名称空间添加到内部元素中

将xml转换为没有soapEnvolpe和名称空间的xml,并使用xslt将名称空间添加到内部元素中,xml,xslt,Xml,Xslt,我一直在致力于将xml转换为一个没有soapEnvolope和soapBody的新xml。此外,我正在尝试删除现有的多个名称空间,并将其替换为一个(新的)名称空间 请在下面找到我试图转换的xml <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns11:IATA_InvGuaranteeRS xmlns:

我一直在致力于将xml转换为一个没有soapEnvolope和soapBody的新xml。此外,我正在尝试删除现有的多个名称空间,并将其替换为一个(新的)名称空间

请在下面找到我试图转换的xml

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <ns11:IATA_InvGuaranteeRS xmlns:ns2="http://www.iata.org/IATA/2015/00/2019.2/IATA_InvGuaranteeRS" xmlns:ns3="http://www.iata.org/IATA/2015/00/2019.2/IATA_OrderChangeRQ" xmlns:ns4="http://www.iata.org/IATA/2015/00/2019.2/IATA_OrderViewRS" xmlns:ns5="http://www.iata.org/IATA/2015/00/2019.2/IATA_OrderRetrieveRQ" xmlns:ns6="http://www.iata.org/IATA/2015/00/2019.2/IATA_InvReleaseNotifRQ" xmlns:ns7="http://www.iata.org/IATA/2015/00/2019.2/IATA_Acknowledgement" xmlns:ns8="http://www.iata.org/IATA/2015/00/2019.2/IATA_OfferPriceRQ" xmlns:ns9="http://www.iata.org/IATA/2015/00/2019.2/IATA_OfferPriceRS" xmlns:ns10="http://www.iata.org/IATA/2015/00/2019.2/IATA_AirShoppingRQ" xmlns:ns11="http://www.iata.org/IATA/2015/00/2019.2/IATA_AirShoppingRS" xmlns:ns12="http://www.iata.org/IATA/2015/00/2019.2/IATA_OrderCreateRQ" xmlns:ns13="http://www.iata.org/IATA/2015/00/2019.2/IATA_OrderReshopRQ" xmlns:ns14="http://www.iata.org/IATA/2015/00/2019.2/IATA_OrderReshopRS" xmlns:ns15="http://www.iata.org/IATA/2015/00/2019.2/IATA_SeatAvailabilityRQ" xmlns:ns16="http://www.iata.org/IATA/2015/00/2019.2/IATA_SeatAvailabilityRS" xmlns:ns17="http://www.iata.org/IATA/2015/00/2019.2/IATA_OrderCancelRQ" xmlns:ns18="http://www.iata.org/IATA/2015/00/2019.2/IATA_OrderCancelRS" xmlns:ns19="http://www.iata.org/IATA/2015/00/2019.2/IATA_OrderRulesRQ" xmlns:ns20="http://www.iata.org/IATA/2015/00/2019.2/IATA_OrderRulesRS" xmlns:ns21="http://www.iata.org/IATA/2015/00/2019.2/IATA_OrderListRQ" xmlns:ns22="http://www.iata.org/IATA/2015/00/2019.2/IATA_OrderListRS" xmlns:ns23="http://www.iata.org/IATA/2015/00/2019.2/IATA_ServiceListRQ" xmlns:ns24="http://www.iata.org/IATA/2015/00/2019.2/IATA_ServiceListRS" xmlns:ns25="http://www.iata.org/IATA/2015/00/2019.2/IATA_InvGuaranteeRQ" xmlns:ns26="http://www.travel.com/wsdl/ndc">
            <ns11:Response>
                <ns11:DataLists>
                    <ns11:OriginDestList>
                        <ns11:OriginDest>
                            <ns11:DestCode>AYT</ns11:DestCode>
                            <ns11:Origin Code="FRA">FRA</ns11:Origin>
                            <ns11:OriginDestID>V1_OD.1595044928630</ns11:OriginDestID>
                            <ns11:PaxJourneyRefID>V1_FL.1595044929364</ns11:PaxJourneyRefID>
                        </ns11:OriginDest>
                    </ns11:OriginDestList>
                </ns11:DataLists>
            </ns11:Response>
        </ns11:IATA_InvGuaranteeRS>
    </soap:Body>
</soap:Envelope>

艾特
FRA
V1_外径1595044928630
V1_FL.1595044929364
请查找我提出的xslt,但它不完整。我想知道我错过了什么。我正在尝试实现XSLT1.0解决方案

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:iata="http://www.iata.org/IATA/2015/00/2019.2/IATA_InvGuaranteeRS"
                xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <!-- remove all elements in the soapenv namespace -->
    <xsl:template match="soapenv:*">
        <xsl:apply-templates select="node()"/>
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>
    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="." />
        </xsl:attribute>
    </xsl:template>
    <xsl:template match="text() | comment() | processing-instruction()">
        <xsl:copy />
    </xsl:template>
</xsl:stylesheet>

预期的结果是

<IATA_InvGuaranteeRS xmlns:iata="http://www.iata.org/IATA/2015/00/2019.2/IATA_InvGuaranteeRS">
    <Response>
        <DataLists>
            <OriginDestList>
                <OriginDest>
                    <DestCode>AYT</DestCode>
                    <Origin Code="FRA">FRA</Origin>
                    <OriginDestID>V1_OD.1595044928630</OriginDestID>
                    <PaxJourneyRefID>V1_FL.1595044929364</PaxJourneyRefID>
                </OriginDest>
            </OriginDestList>
        </DataLists>
    </Response>
</IATA_InvGuaranteeRS>

艾特
FRA
V1_外径1595044928630
V1_FL.1595044929364

有人能帮我理解我错过了什么吗?我生成的xslt删除了所有名称空间,并且我无法在它之后添加任何名称空间。

对于根节点上的默认名称空间,只需将
名称空间
参数添加到
*
模板:

<xsl:template match="*">
    <xsl:element name="{local-name()}" namespace="http://www.iata.org/IATA/2015/00/2019.2/IATA_InvGuaranteeRS">
        <xsl:apply-templates select="@* | node()" />
    </xsl:element>
</xsl:template>

请描述当前XSLT的问题。只是根目录中缺少的名称空间?为什么要定义前缀名称空间而不在子元素中使用它?为什么不是默认名称空间(即没有
iata
前缀作为
xmlns:iata=“…”
)?感谢您的建议,我更新了问题(是的,它是根目录中缺少的名称空间)。但不幸的是,我无法回答你的最后一个问题。xml是知名的第三方提供的标准格式,他们只是声明了一个前缀名称空间,而从未在子元素中使用它。你的观点是正确的,这不是正确的方法。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                    
                xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                xmlns:ns11="http://www.iata.org/IATA/2015/00/2019.2/IATA_AirShoppingRS"
                exclude-result-prefixes="soapenv ns11"
                version="1.0">

    ...same as before...

    <xsl:template match="ns11:IATA_InvGuaranteeRS">
        <IATA_InvGuaranteeRS xmlns:iata="http://www.iata.org/IATA/2015/00/2019.2/IATA_InvGuaranteeRS">
            <xsl:apply-templates select="@* | node()" />
        </IATA_InvGuaranteeRS>
    </xsl:template>
</xsl:stylesheet>