es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Procesamiento de XSLT: dos archivos de entrada en uno de salida.

Estoy intentando procesar dos archivos xml (documentos docbook). En el documento hay estructuras repetidas que quiero extraer de ambos documentos, parametrizar y almacenar en un documento separado.

Para simplificar, aquí hay un ejemplo:

file1.xml:

<?xml version="1.0" encoding="UTF-8"?>
<input>
    <structure>foo</structure>
    <structure>bar</structure>
    <structure>baz</structure>

file2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<input>
    <structure>abc</structure>
    <structure>xyz</structure>
    <structure>123</structure>

Y este es el resultado preferido que me gustaría generar.
output.xml:

<?xml version="1.0" encoding="UTF-8"?>
<output>
    <structure origin="doc1">foo</structure>
    <structure origin="doc1">bar</structure>
    <structure origin="doc1">baz</structure>
    <structure origin="doc2">abc</structure>
    <structure origin="doc2">xyz</structure>
    <structure origin="doc2">123</structure>
</output>

Ahora, no sé cómo convertir dos o más documentos (la URI puede estar codificada) y un parámetro adicional (doc1, doc2, estos también pueden estar codificados) en XSLT.

Agradecería mucho cualquier indicación.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para extraer y parametrizar estructuras repetitivas de varios documentos docbook y almacenarlas en un documento separado, puedes utilizar el procesamiento XSLT con los siguientes pasos:

    1. Define una variable XSLT para almacenar el valor del parámetro, como el origen del documento (doc1 o doc2).
    2. Utiliza la función document() para leer cada documento docbook desde una URI específica.
    3. Utiliza un bucle for-each para iterar sobre cada elemento structure en ambos documentos.
    4. Para cada elemento structure, crea un nuevo elemento output con un elemento hijo structure y un atributo origin establecido con el valor del parámetro XSLT.
    5. Genera el elemento output resultante como el documento de salida final.

    Aquí tienes un ejemplo de hoja de estilo XSLT que implementa estos pasos:

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:param name="origin" select="'doc1'"></xsl:param>
    
      <xsl:template match="/">
        <output>
          <xsl:for-each select="document('file1.xml')//structure | document('file2.xml')//structure">
            <structure origin="{$origin}">
              <xsl:value-of select="."></xsl:value-of>
            </structure>
          </xsl:for-each>
        </output>
      </xsl:template>
    </xsl:stylesheet>
    

    Para utilizar esta hoja de estilo, puedes aplicarla a cualquier documento de entrada XML, ya que no depende de ninguna estructura de entrada específica. Al aplicarla, leerá los documentos docbook desde las URI codificadas (file1.xml y file2.xml en este ejemplo) y parametrizará los elementos structure resultantes con el valor del parámetro origin. La salida será un documento XML con la estructura mostrada en el ejemplo (output.xml).

Comments are closed.