2009-11-13 20 views
35

Tengo un XML que estoy tratando de transformar a HTML usando XSLT, pero no puedo hacer que funcione por mi vida. ¿Puede alguien decirme qué estoy haciendo mal?XSLT Transform XML with Namespaces

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> 

Respuesta

49

Debe proporcionar un prefijo de espacio de nombres en su xslt para los elementos que está transformando. Por alguna razón (al menos en un analizador JAXP de Java) no puede simplemente declarar un espacio de nombres predeterminado. Esto funcionó para mí:

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

Esto captará todo lo que está espaciado de nombres en su documento XML.

+0

Esto funcionó para mí también en las pruebas (ejecución de depuración XSLT en Visual Studio 2008) – Murph

+0

Esto hizo el truco. Había intentado esto con la combinación de exclude-result-prefixes = "t" porque pensé que me permitiría no tener que virar t: antes de cada nodo. ¿Hay alguna forma de evitar tener que hacer esto? – Chris

+2

No creo que exista. –

-2

¿Cómo se ejecuta la transformación? Quizás olvidó vincular la hoja de estilo XSLT para documentos XML usando:

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

al principio del documento XML. More explanation here.

+0

No estoy seguro de lo que quiere decir con esto. En realidad, no estoy haciendo una transformación en un archivo XML sino más bien serializando un objeto comercial usando DataContractSerializer y especificando el espacio de nombres en el DataContract del objeto. – Chris