2012-10-20 19 views
8

Mój problem polega na dodawaniu przestrzeni nazw i prefiksów dla wszystkich elementów i atrybutów przy użyciu XSLT? Moje xml wejściowe jak jest ....Jak dodać przestrzeń nazw i prefiks dla wszystkich elementów i atrybutów za pomocą XSLT?

<ProcessCreditMemo xmlns='CreditMemo' 
        xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
        xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
        xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> 
<ORDER_HEADERDetails> 
    <ORDER_HEADER> 
    <NAME>0010185214</NAME> 

być ...

<ns0:ProcessCreditMemo xmlns='CreditMemo' 
         xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
         xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
         xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' 
         xmlns:ns0="http://tempuri.org/"> 
<ns0:ORDER_HEADERDetails> 
    <ns0:ORDER_HEADER> 
    <ns0:NAME>0010185214</NAME> 

muszę dodać przedrostek "NS0:" dla wszystkich elementów i atrybutów, a także dodać przestrzeń nazw „xmlns . NS0 = "http://tempuri.org/" w nagłówku "ProcessCreditMemo"

próbuję zbudować XSLT to zrobić ...

<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
<xsl:template match="node()|text()|@*"> 
    <xsl:copy> 
     <xsl:if test="local-name()='ProcessCreditMemo'"> 
      <xsl:attribute name="xmlns" namespace="http://tempuri.org/" /> 
     </xsl:if> 

, ale wynikowy kod XML duplikuje przedrostek z pustą wartością.

<ProcessCreditMemo xmlns="CreditMemo" 
        xmlns:ns0="http://tempuri.org/" 
        xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        ns0:xmlns=""> 

Odpowiedz

13

Ta przemiana:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns0="http://tempuri.org/"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="*"> 
    <xsl:element name="ns0:{name()}" namespace="http://tempuri.org/"> 
    <xsl:copy-of select="namespace::*"/> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

po nałożeniu na (poprawione), pod warunkiem wejścia (poważnie zniekształcone, niepełne XML):

<ProcessCreditMemo xmlns='CreditMemo' 
    xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
    xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
    xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> 
    <ORDER_HEADERDetails> 
    <ORDER_HEADER> 
     <NAME>0010185214</NAME> 
    </ORDER_HEADER> 
    </ORDER_HEADERDetails> 
</ProcessCreditMemo> 

produkuje poszukiwany, poprawny wynik (nie jest to źle sformułowany/niekompletny wynik poszukiwany)):

<ns0:ProcessCreditMemo xmlns:ns0="http://tempuri.org/" xmlns="CreditMemo" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <ns0:ORDER_HEADERDetails> 
     <ns0:ORDER_HEADER> 
     <ns0:NAME>0010185214</ns0:NAME> 
     </ns0:ORDER_HEADER> 
    </ns0:ORDER_HEADERDetails> 
</ns0:ProcessCreditMemo> 
+0

używam podobny fragment kodu w moim XSLT ale mój zaćmienie utrzymuje pokazując komunikat o błędzie jako nieprawidłowy XPath dla .... .. Jednak konwersja xml działa idealnie. –

Powiązane problemy