Domanda

Ho diversi file XML, i cui nomi sono memorizzati in un altro file XML.

Voglio usare xsl per produrre un riepilogo della combinazione dei file xml. Ricordo che c'era un modo per farlo con le estensioni msxml (sto usando msxml).

So di poter ottenere il contenuto di ogni file usando select = " document (nome file) " ma non sono sicuro di come combinare tutti questi documenti in uno solo.

21-ott-08 Avrei dovuto menzionare che desidero eseguire ulteriori elaborazioni sull'xml combinato, quindi non è sufficiente emetterlo dalla trasformazione, ma è necessario memorizzarlo come set di nodi in una variabile.

È stato utile?

Soluzione

Ecco un piccolo esempio di ciò che potresti fare:

file1.xml:

<foo>
<bar>Text from file1</bar>
</foo>

file2.xml:

<foo>
<bar>Text from file2</bar>
</foo>

index.xml:

<index>
<filename>file1.xml</filename>
<filename>file2.xml</filename>

summarize.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl">

  <xsl:variable name="big-doc-rtf">
      <xsl:for-each select="/index/filename">
        <xsl:copy-of select="document(.)"/>
      </xsl:for-each>
  </xsl:variable>

  <xsl:variable name="big-doc" select="exsl:node-set($big-doc-rtf)"/>

  <xsl:template match="/">
    <xsl:element name="summary">
      <xsl:apply-templates select="$big-doc/foo"/>
    </xsl:element>  
  </xsl:template>

  <xsl:template match="foo">
    <xsl:element name="text">
      <xsl:value-of select="bar"/>
    </xsl:element>  
  </xsl:template>

</xsl:stylesheet>

L'applicazione del foglio di stile su index.xml ti dà:

<?xml version="1.0" encoding="UTF-8"?><summary><text>Text from file1</text><text>Text from file2</text></summary>

Il trucco è caricare i diversi documenti con la funzione documento (funzione di estensione supportata da quasi tutti i processori XSLT 1.0), per generare il contenuto come parte di un corpo variabile e quindi convertire la variabile in un set di nodi per ulteriori elaborazione.

Altri suggerimenti

Supponi di avere i nomi dei file elencati in un file come questo:

<files>
    <file>a.xml</file>
    <file>b.xml</file>
</files>

Quindi puoi usare un foglio di stile come questo nel file sopra:

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

    <xsl:template match="/">
        <root>
            <xsl:apply-templates select="files/file"/>                          
        </root>
    </xsl:template>

    <xsl:template match="file">
        <xsl:copy-of select="document(.)"/>
    </xsl:template>
</xsl:stylesheet>

Dai un'occhiata al documento ( ) documentazione delle funzioni .

Puoi usare document () per caricare altri documenti XML durante il processo di trasformazione. Sono caricati come set di nodi. Ciò significa che inizialmente dovresti alimentare l'XML che contiene i nomi dei file da caricare su XSLT e prenderlo da lì:

<xsl:copy-of select="document(@href)/"/>

Grazie per tutte le risposte. Ecco il coraggio della soluzione che sto usando con msxml.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="urn:schemas-microsoft-com:xslt">
  <xsl:output method="xml"/>
  <xsl:template match="/">
    <xsl:variable name="combined">
      <xsl:apply-templates select="files"/>
    </xsl:variable>
    <xsl:copy-of select="ms:node-set($combined)"/>
  </xsl:template>
  <xsl:template match="files">
    <multifile>
      <xsl:apply-templates select="file"/>
    </multifile>
  </xsl:template>
  <xsl:template match="file">
    <xsl:copy-of select="document(@name)"/>
  </xsl:template>
</xsl:stylesheet>

Ora sto cercando di migliorare le prestazioni poiché ogni file è di circa 8 MB e la trasformazione richiede molto tempo, ma questa è un'altra domanda.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top