2011-01-16 22 views
22

Actualmente estoy haciendo algo de trabajo XML-> XSLT-> (HTML5/CSS3). Ahora mismo tengo un archivo menu.xml, y me gustaría incluirlo en el archivo XSL o en la página XML. He realizado muchas búsquedas, pero no puedo encontrar una respuesta directa.Incluyendo un archivo XML en un archivo XML/XSL

Entonces, ¿cómo incluyo un archivo XML en otro archivo XML o en un archivo XSL?

Editar: Por incluir, me refiero a hacer referencia/cargarlo desde otro archivo, no copiarlo y pegarlo o simplemente incrustarlo.

+0

Al 'incluirlo', ¿quiere decir que quiere copiar/pegar los contenidos de menu.xml en otro archivo y alojarlo allí sin problemas, o quiere decir que quiere alguna forma de referencia remota del menú. xml del archivo host, ¿o quiere decir que quiere que su servidor web copie el contenido de menu.xml en el archivo host antes de servirlo, como si hubiera copiado/pegado el contenido usted mismo? – Phrogz

+0

Ah, me refiero a como hacer referencia al archivo, sin incluirlo. Maldita sea mi programación hablar. Estoy demasiado acostumbrado a C. – Jookia

+1

Buena pregunta, +1. Consulte mi respuesta para obtener una explicación y dos ejemplos completos de códigos que responden a sus preguntas. :) –

Respuesta

33

I. Aquí es cómo cualquier documento XML o fragmento se pueden incrustar en una hoja de estilo XSLT y utilizados durante la transformación:

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

<my:menu> 
    <menu> 
    <choice>A</choice> 
    <choice>B</choice> 
    <choice>C</choice> 
    </menu> 
</my:menu> 

<xsl:template match="/"> 
    <xsl:copy-of select="document('')/*/my:menu/*"/> 
</xsl:template> 
</xsl:stylesheet> 

Cuando se aplica esta transformación en cualquier documento XML (no se utiliza en este ejemplo), el resultado deseado (sólo copiar el código XML) se produce:

<menu xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my:my"> 
    <choice>A</choice> 
    <choice>B</choice> 
    <choice>C</choice> 
</menu> 

Recuerde: Cualquier XM L se puede incrustar en una hoja de estilos XSLT, siempre que esté envuelto en un elemento de espacio de nombres (el espacio de nombres no el espacio de nombres XSLT) y este elemento de ajuste está en el nivel global (un elemento secundario del elemento <xsl:stylesheet> (arriba)).

II. Acceso al menú de archivo XML que reside en un archivo XML independiente:

Para hacer esto tenemos que cambiar ligeramente el ejemplo anterior:

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


<xsl:template match="/"> 
    <xsl:copy-of select="document('menu.XML')/*"/> 
</xsl:template> 
</xsl:stylesheet> 

Si el archivo de menú XML está en el archivo 'menu.XML' (en el mismo directorio que el archivo de hoja de estilo XSLT, entonces esta transformación produce exactamente el mismo resultado que el anterior:

<menu> 
    <choice>A</choice> 
    <choice>B</choice> 
    <choice>C</choice> 
</menu> 

Do sin Te: En ambos casos estamos utilizando la función XSLT estándar document()

Por lo general, uno define una variable a nivel mundial, cuyo valor es el resultado de llamar a la función document(). Luego se accede a esta variable y su contenido a través de expresiones XPath durante la transformación.

+0

¿Es posible aplicar plantillas en el documento incluido (menú.xml) también, como cualquier otro elemento? –

+3

@ lisérgico-ácido: Sí, ¿por qué crees que esto no es posible? Intenta con '' o lo que quieras ver para que funcione como se supone que debe hacerlo. –

0

Si simplemente insertando el archivo dentro del archivo XML no es una solución, entonces se debe agregar un campo url que el programa interprete, básicamente se está buscando el equivalente de un include (menu.xml) o require (xml), pero en un archivo XML.

Así que como está escribiendo el programa que está interpretando el archivo, puede agregar una etiqueta <externalMenuTagThatYouDecideToAddToTheBaseXmlFile> o lo que sea que quiera llamar que leerá e insertará la nota raíz de menu.xml el lugar de <externalMenuTagThatYouDecideToAddToTheBaseXmlFile>.

Buena suerte y que sus programas compilen siempre.

+1

No estoy realmente escribiendo un intérprete, estoy escribiendo un sitio web. > _> – Jookia

5

Entonces, ¿cómo incluyo un archivo XML en otro archivo XML o en un archivo XSL?

Puede utilizar un external entity hacer referencia al archivo menu.xml e incluyen el contenido, ya sea en un archivo XML o XSLT (o ambos).

Por incluyen, me refiero a hacer referencia a/carga desde otro archivo, no copiar y pegar o simplemente incrustarlo.

Mediante el uso de entidades externas, puede hacer referencia/cargar la menu.xml contenido de archivos externos y no tienen que duplicar el contenido XML.

Por ejemplo, si desea el contenido menu.xml incluido en su XSLT, sería declarar la entidad externa en su XSLT como esto:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE stylesheet [ 
    <!ENTITY menu SYSTEM "./menu.xml"> 
]> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

y luego se podría hacer referencia a ella como lo haría con cualquier otra entidad :

&menu; 

Cuando el XSLT analiza, la referencia de la entidad se ampliará y el contenido XML del menu.xml se incluirá como parte del documento XSLT como si hubiera copiar/pegar en el lugar donde la entidad referencia fue.

+0

No es una mala respuesta, pero esto no es * "referencia/carga" * pero el reemplazo en la sintaxis superficial es más raro que en la abstracción lógica. –

+1

envoltura &menu; en un objeto local permitiría que todos los xpaths dentro del menú xml se usen dentro de xslt. ex: &menu; y luego sandeepkunkunuru

1

Tengo a blog post en esto. Utiliza document() para obtener el otro XML y pasar el contenido usando parámetros.

1

No pude obtener el código que las personas proporcionaron. Sin embargo, obtuve una solución después de probar varias cosas. Nombrar un clGroup.xml archivo XML (dos primeras letras no son importantes, pero estoy encontrando "Grupo" se requiere este archivo XML hará referencia al XML que desea analizar

clGroup xml:..

<?xml version='1.0' encoding="UTF-8" ?> 
<?xml-stylesheet type="text/xsl" href="calendarGroup.xslt" ?> 
<groups> 
    <groupRef>caGroup.xml</groupRef> 
</groups> 

Ahora nombrar caGroup.xml archivo y poner en el siguiente código:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<topics xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <topic> 
     <topicstopic>Calendar</topicstopic> 
     <topicsubmitter>Calendar</topicsubmitter> 
     <creatoremail>[email protected]</creatoremail> 
    </topic> 
    <topic> 
     <name>Week1</name> 
     <sunday/> 
     <monday/> 
     <tuesday>Test01 Young Men Weekly</tuesday> 
     <wednesday>02 Elders Home Teaching Message Birthday</wednesday> 
     <thursday>03 </thursday> 
     <friday>04 </friday> 
     <saturday>05 #Young Men Weekly</saturday> 
    </topic> 
    <topic> 
     <name>Week2</name> 
     <sunday>06 Fast Sunday</sunday> 
     <monday>07 FHE</monday> 
     <tuesday>08 Young Men Tonight #Young Men Weekly going to Bishops storehouse 6PM to 7PM Young Men Weekly</tuesday> 
     <wednesday>09 </wednesday> 
     <thursday>10 Scout Round Table at 7 PM </thursday> 
     <friday>11 </friday> 
     <saturday>12 </saturday> 
    </topic> 
    </topics> 

Ahora aquí es mi archivo XSLT calendarGroup.xslt

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

<xsl:output method="html" 
      version="1.0" 
      encoding="UTF-8" 
      indent="yes"/> 

<xsl:template match="groups/groupRef"> 
    <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title>Table</title> 
     <meta charset="utf-8" /> 
    </head> 
    <body> 
     <table border="1"> 
     <tr> 
      <th>Sunday</th> 
      <th>Monday</th> 
      <th>Tuesday</th> 
      <th>Wednesday</th> 
      <th>Thursday</th> 
      <th>Friday</th> 
      <th>Saturday</th> 
     </tr>   
     <xsl:for-each select="document(.)//topic"> 
      <xsl:if test="string(name) != ''"> 
      <tr> 
      <td> 
       <xsl:value-of select="sunday"/> 
      </td> 
      <td> 
       <xsl:value-of select="monday"/> 
      </td> 
      <td> 
       <xsl:value-of select="tuesday"/> 
      </td> 
      <td> 
       <xsl:value-of select="wednesday"/> 
      </td> 
      <td> 
       <xsl:value-of select="thursday"/> 
      </td> 
      <td> 
       <xsl:value-of select="friday"/> 
      </td> 
      <td> 
       <xsl:value-of select="saturday"/> 
      </td> 
      </tr> 
      </xsl:if> 
     </xsl:for-each> 
     </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

El beneficio de configurar mi código de esta manera es que puedo crear fácilmente el xml de un archivo de Excel y no la mitad para ponerlo en una declaración de declaración en el archivo recién creado. Necesitas tener el formato "xxGroup" para que esto funcione en conjunto. Puede agregar más grupos al archivo clGroup y los analizará en XSLT, lo que le permite incluir más xml en el mismo analizador XSLT. Asegúrese de que todos estén en el mismo directorio.

+0

No hay magia en la cadena "Grupo "- puedes usar cualquier nombre que quieras. –

+0

¡Gracias! Es extraño porque cuando cambio los nombres de la redacción no funciona por alguna razón para mí. Lo bueno que veo es que puedes agregar varios archivos XML a la agrupación y los analizará. – Cody

Cuestiones relacionadas