2012-10-20 17 views
8

Il mio problema è come aggiungere spazio dei nomi e prefisso per tutti gli elementi e gli attributi usando XSLT? mio xml ingresso come è ....Come aggiungere spazio dei nomi e prefisso per tutti gli elementi e gli attributi utilizzando 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> 

per essere ...

<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> 

ho bisogno di aggiungere il prefisso "ns0:" per tutti gli elementi e gli attributi, e aggiungere lo spazio dei nomi "xmlns :. ns0 = "http://tempuri.org/" nell'intestazione "ProcessCreditMemo"

sto cercando di costruire un XSLT per farlo ...

<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> 

ma l'XML risultante duplica il prefisso con un valore vuoto.

<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=""> 

risposta

13

Questa trasformazione:

<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> 

quando applicato sulla (corretto) disponibile ingresso (gravemente errato, incompleto 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> 

produce il desiderato, risultato corretto (non il risultato ricercato gravemente malformato/incompleto fornito):

<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

Sto usando un codice simile a mio frammento di XSLT, ma la mia eclissi continua a visualizzare il messaggio di errore XPath non valida per .... .. Tuttavia, la conversione xml funziona perfettamente. –

Problemi correlati