Frage

Ich habe mehrere XML-Dateien, deren Namen in einem anderen XML-Datei gespeichert.

Ich möchte xsl verwenden, um eine Zusammenfassung der Kombination der XML-Dateien zu erzeugen. Ich erinnere mich, es war eine Möglichkeit, dies mit den msxml Erweiterungen zu tun (ich bin mit MSXML).

Ich weiß, ich kann den Inhalt jeder Datei mit select="document(filename)" bekommen, aber ich bin nicht sicher, wie alle diese Dokumente in einem kombinieren.

21-Oct-08 I erwähnt haben soll, dass ich eine weitere Verarbeitung auf dem kombinierten xml tun will, so ist es nicht ausreichend, nur ausgegeben, um es von der Transformation, muß ich es als ein Knoten in einer Variable speichern.

War es hilfreich?

Lösung

Hier ist nur ein kleines Beispiel von dem, was Sie auf kann zu tun:

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>

Die Anwendung des Sheet index.xml gibt Ihnen:

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

Der Trick besteht darin, die verschiedenen Dokumente mit der Dokumentenfunktion (Erweiterungsfunktion unterstützt von fast allen XSLT 1.0 Prozessoren), zur Ausgabe als Teil eines variablen Körper den Inhalt zu laden, und dann wird die Variable auf einen Knotenmenge für eine weitere zu konvertieren Verarbeitung.

Andere Tipps

Angenommen, Sie die Dateinamen in einer Datei wie folgt aufgelistet haben:

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

Dann könnten Sie ein Stylesheet, wie dies auf der obigen Datei:

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

Haben Sie einen Blick auf die document() Funktion Dokumentation .

Sie können document() nutzen, um XML-Dokumente während des Transformationsprozesses zu laden. Sie werden als Knotenmengen geladen. Das heißt, Sie würden zunächst die XML-Feed, der die Dateinamen enthält, die die XSLT zu laden, und nehmen Sie es von dort aus:

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

Danke für alle Antworten. Hier ist das Eingeweide der Lösung, die ich mit msxml bin mit.

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

Jetzt versuche ich, die Leistung zu verbessern, da jede Datei ist rund 8 MB und die Transformation eine sehr lange Zeit dauert, aber das ist eine andere Frage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top