2009-11-13 27 views
35

Ho un codice XML che sto cercando di trasformare in HTML usando XSLT, ma non riesco a farlo funzionare per la vita di me. Qualcuno può dirmi cosa sto facendo di sbagliato?XSLT Transform XML with Namespace

XML

<ArrayOfBrokerage xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.test.com/"> 
    <Brokerage> 
     <BrokerageID>91</BrokerageID> 
     <LastYodleeUpdate>0001-01-01T00:00:00</LastYodleeUpdate> 
     <Name>E*TRADE</Name> 
     <Validation i:nil="true" /> 
     <Username>PersonalTradingTesting</Username> 
    </Brokerage> 
</ArrayOfBrokerage> 

XSLT

<xsl:stylesheet version="1.0" xmlns="http://www.test.com/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xslFormatting="urn:xslFormatting"> 

    <xsl:output method="html" indent="no"/> 

    <xsl:template match="/ArrayOfBrokerage"> 
     <xsl:for-each select="Brokerage"> 
      Test 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

risposta

49

È necessario fornire un prefisso dello spazio dei nomi in xslt per gli elementi che si stanno trasformando. Per qualche ragione (almeno in un parser JAXP Java) non si può semplicemente dichiarare uno spazio dei nomi predefinito. Questo ha funzionato per me:

<xsl:stylesheet version="1.0" xmlns:t="http://www.test.com/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xslFormatting="urn:xslFormatting"> 

    <xsl:output method="html" indent="no"/> 

    <xsl:template match="/t:ArrayOfBrokerage"> 
     <xsl:for-each select="t:Brokerage"> 
      Test 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

Ciò catturerà tutto ciò che è il namespace nel documento XML.

+0

Questo ha funzionato anche per me in testing (eseguendo il debug XSLT in Visual Studio 2008) – Murph

+0

Questo ha fatto il trucco. Avevo provato questo con la combinazione di exclude-result-prefixes = "t" perché pensavo che mi avrebbe permesso di non dover virare su t: prima di ogni nodo. C'è un modo per evitare di dover fare questo? – Chris

+2

Non penso ci sia. –

-2

Come si esegue la trasformazione? Forse hai dimenticato di collegare il foglio di stile XSLT al documento XML usando:

<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?> 

all'inizio del documento XML. More explanation here.

+0

Non sono sicuro di cosa intendi con questo. In realtà non sto facendo una trasformazione su un file XML, ma piuttosto serializzando un oggetto business utilizzando DataContractSerializer e specificando lo spazio dei nomi nel DataContract dell'oggetto. – Chris