Не могли бы вы помочь мне с кодом XSLT для преобразования ниже XML -
Ввод XML:
<?xml version="1.0" encoding="UTF-8"?> <ns0:PrintCertificateByContractNumber xmlns:ns0="http://tempuri.org/"> <ns0:ContractNumber>300001111</ns0:ContractNumber> <ns0:Credentials> <ns1:Password xmlns:ns1="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common">uuuuuuuuuuuuuu</ns1:Password> <ns1:ResponseStatusList xmlns:ns1="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common"> <ns2:ResponseStatus xmlns:ns2="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities"> <ns2:ErrorMessage/> <ns2:ResponseType>Error</ns2:ResponseType> </ns2:ResponseStatus> </ns1:ResponseStatusList> <ns1:UserName xmlns:ns1="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common">xxxxxxxxxxxxxxxx</ns1:UserName> <ns1:UserReferenceNumber xmlns:ns1="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common"/> </ns0:Credentials> </ns0:PrintCertificateByContractNumber>
Вывод XML, что необходимо:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/" xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" xmlns:ep41="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities"> <soap:Header/> <soap:Body> <tem:PrintCertificateByContractNumber> <tem:ContractNumber>?</tem:ContractNumber> <tem:Credentials> <ep4:Password>uuuuuuuu</ep4:Password> <ep4:ResponseStatusList> <ep41:ResponseStatus> <ep41:ErrorMessage></ep41:ErrorMessage> <ep41:ResponseType>Error</ep41:ResponseType> </ep41:ResponseStatus> </ep4:ResponseStatusList> <ep4:UserName>xxxxxxxx</ep4:UserName> <ep4:UserReferenceNumber></ep4:UserReferenceNumber> </tem:Credentials> </tem:PrintCertificateByContractNumber> </soap:Body> </soap:Envelope>
XSLT-код, который я использую:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" exclude-result-prefixes="ns0 ns1 ns2" xmlns:ns2="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities" xmlns:ns1="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" xmlns:ns0="http://tempuri.org/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output version="1.0" encoding="UTF-8" method="xml"/> <xsl:template match="/"> <soapenv:Envelope xmlns:ep41="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities" xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" xmlns:tem="http://tempuri.org/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <tem:PrintCertificateByContractNumber> <tem:ContractNumber> <xsl:value-of select="ns0:PrintCertificateByContractNumber/ns0:ContractNumber"/> </tem:ContractNumber> <tem:Credentials> <ep4:Password> <xsl:value-of select="ns0:PrintCertificateByContractNumber/ns0:Credentials/ns1:Password"/> </ep4:Password> <ep4:ResponseStatusList> <ep41:ResponseStatus> <ep41:ErrorMessage> <xsl:value-of select="ns0:PrintCertificateByContractNumber/ns0:Credentials/ns1:ResponseStatusList/ns2:ResponseStatus/ns2:ErrorMessage"/> </ep41:ErrorMessage> <ep41:ResponseType> <xsl:value-of select="ns0:PrintCertificateByContractNumber/ns0:Credentials/ns1:ResponseStatusList/ns2:ResponseStatus/ns2:ResponseType"/> </ep41:ResponseType> </ep41:ResponseStatus> </ep4:ResponseStatusList> <ep4:UserName> <xsl:value-of select="ns0:PrintCertificateByContractNumber/ns0:Credentials/ns1:UserName"/> </ep4:UserName> <ep4:UserReferenceNumber> <xsl:value-of select="ns0:PrintCertificateByContractNumber/ns0:Credentials/ns1:UserReferenceNumber"/> </ep4:UserReferenceNumber> </tem:Credentials> </tem:PrintCertificateByContractNumber> </soapenv:Body> </soapenv:Envelope> </xsl:template> </xsl:stylesheet>
Вывод получаю:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <tem:PrintCertificateByContractNumber xmlns:tem="http://tempuri.org/"> <tem:ContractNumber/> <tem:Credentials> <ep4:Password xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" /> <ep4:ResponseStatusList xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common"> <ep41:ResponseStatus xmlns:ep41="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities"> <ep41:ErrorMessage/> <ep41:ResponseType/> </ep41:ResponseStatus> </ep4:ResponseStatusList> <ep4:UserName xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" /> <ep4:UserReferenceNumber xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" /> </tem:Credentials> </tem:PrintCertificateByContractNumber> </soapenv:Body> </soapenv:Envelope>
Невозможно удалить пространства имен из "Password" et c. из сопоставления, которое я использую. Не могли бы вы дать мне знать, как удалить пространства имен из окончательного результата удалите XLST, не копируя данные для каждого узла.
AFAICT, вывод, который вы получаете, семантически идентичен выводу, который вы хотите. Размещение объявлений пространства имен совершенно несущественно, и у вас очень мало контроля над ним, по крайней мере, в XSLT 1.0.
Это не должно иметь значения для принимающей заявки - и если это так, проблема должна быть там исправлена. Вы можете попытаться принудительно добавить объявления пространства имен к элементу root, сделав заголовок:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="http://tempuri.org/" xmlns:ns1="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" xmlns:ns2="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" xmlns:ep41="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities" exclude-result-prefixes="ns0 ns1 ns2" >
, а затем изменив:
<soapenv:Envelope xmlns:ep41="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities" xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" xmlns:tem="http://tempuri.org/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
на:
<soapenv:Envelope> <xsl:copy-of select="document('')/xsl:stylesheet/namespace::tem | document('')/xsl:stylesheet/namespace::ep4 | document('')/xsl:stylesheet/namespace::ep41"/>
Это может или не может работать, в зависимости от вашего процессора XSLT.