2009-08-10 25 views
8

¿Cómo crear XML a partir de XML utilizando XSL?¿Cómo crear XML a partir de XML utilizando XSL?

que trato como esto .. pero no obtengo un resultado

Test.Xml

<Address> 
    <name> Alex</name> 
    <lastname>Mathew</lastname> 
</Address> 

Prueba.xsl

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<Address> 
     <FirstName><xsl:value-of select="name" /></FirstName> 
     <LastName><xsl:value-of select="lastname" /></LastName> 
</Address> 
</xsl:template> 

</xsl:stylesheet> 

Necesito hacia fuera puesto como esto

<Address> 
    <FirstName> Alex</FirstName> 
    <LastName>Mathew</LastName> 
</Address> 

Intento convertir en mi asp pa ge (test.asp)

<% 
'Load XML 
set xml = Server.CreateObject("Microsoft.XMLDOM") 
xml.async = false 
xml.load(Server.MapPath("Test.xml")) 

'Load XSL 
set xsl = Server.CreateObject("Microsoft.XMLDOM") 
xsl.async = false 
xsl.load(Server.MapPath("Test.xsl")) 

'Response.Write(xml.transformNode(xsl)) 
'Response.ContentType = "text/plain; charset=UTF-8" 

Set doc = Server.CreateObject("Msxml2.DOMDocument.3.0") 
doc.async = False 
doc.loadXML(xml.transformNode(xsl)) 

response.write xml.transformNode(xsl) 

response.write doc.getElementsByTagName("FirstName").item(0).text 
%> 

PLZ me ayude a resolver este problema

Respuesta

13

Usted también puede añadir una instrucción de salida en su hoja de estilos:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" indent="yes"/> 

<xsl:template match="/Address"> 
    <Address> 
    <FirstName><xsl:value-of select="name" /></FirstName> 
    <LastName><xsl:value-of select="lastname" /></LastName> 
    </Address> 
</xsl:template> 

</xsl:stylesheet> 

Esto hace que la salida tenga una declaración XML que lleva:

<?xml version="1.0" ?> 
15

El problema es que "/" es la raíz , no el elemento raíz (o "elemento de documento").
Jerárquicamente, "/" es un nivel anterior elemento del documento (<Address>, en su caso). Así que esto:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/Address"> 
    <Address> 
     <FirstName><xsl:value-of select="name" /></FirstName> 
     <LastName><xsl:value-of select="lastname" /></LastName> 
    </Address> 
    </xsl:template> 
</xsl:stylesheet> 

en realidad funcionaría. Tenga en cuenta la pequeña diferencia pequeña? Más agradable sería la siguiente:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- the identity template (copies your input verbatim) --> 
    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- special templates only for things that need them --> 
    <xsl:template match="name"> 
    <FirstName><xsl:value-of select="." /></FirstName> 
    </xsl:template> 

    <xsl:template match="lastname"> 
    <LastName><xsl:value-of select="." /></LastName> 
    </xsl:template> 

</xsl:stylesheet> 
+2

+1 Incluso mejor que eso sería usar '' en lugar de 'xsl: value-of'. –

+1

@DevNull Eso es discutible. Genéricamente hablando, sí; hablando en términos de la situación particular, no realmente. – Tomalak

3

Solo para ampliar y aclarar un poco sobre lo que publicó Tomalak: la raíz de un documento XML es, en el Jerarquía DOM, arriba del elemento de nivel superior. Es excepcionalmente común ver a los dos confundidos. Considere este documento XML:

<!-- This is a node - yes, comments are nodes. --> 
<root> 
    <child/> 
</root> 
<!-- This is also a node. --> 

La raíz de este documento tiene tres nodos hijo: un nodo de comentario, un nodo elemento, y otro nodo comentario. El elemento de nivel superior se llama root, porque eso es lo que hace cada persona que crea documentos de instancia XML para perpetuar la confusión entre la raíz del documento y el elemento de nivel superior. (Especialmente si todavía están en el punto en su educación XML donde usan "nodo" cuando quieren decir "elemento")

Esto nos lleva a una de las razones por las que la plantilla que Tomalak describe como "más agradable" es más agradable. Si extiende la transformación de identidad, lo único que el XSLT cambiará en su documento son los elementos para los que ha creado las plantillas. Todos los demás nodos del documento se copian sin cambios. Por lo tanto, si su documento de entrada contiene comentarios sobre el elemento de nivel superior, como en el ejemplo anterior, no se eliminarán de la salida, como lo harían si simplemente implementara una plantilla que coincida con el elemento Address.

Por supuesto, si quiere su salida para excluir comentarios, eso también se logra fácilmente; simplemente no implemente la transformación de identidad.

Cuestiones relacionadas