Ich muss mehrere XSLT-Transformationen mit XML-Zwischendateien durchführen. (Ich brauche die Dateien, der eigentliche Fall ist etwas komplizierter, da in einem späteren Schritt Zwischendateien geladen werden)
first.xml ------------> intermediate.xml ------------> final.xml
first.xsl final.xsl
Ich möchte eine XProc-Zeichenfolge erstellen. Ich habe versucht, den folgenden Code zu schreiben, aber dies gibt mir einen Fehler:
SCHWERWIEGEND: runxslt.xpl:26:44:err:XD0011:Could not read: intermediate.xml
17.05.2012 15:15:35 com.xmlcalabash.drivers.Main error
SCHWERWIEGEND: It is a dynamic error if the resource referenced by a p:document element does not exist, cannot be accessed, or is not a well-formed XML document.
17.05.2012 15:15:35 com.xmlcalabash.drivers.Main error
SCHWERWIEGEND: Underlying exception: net.sf.saxon.s9api.SaxonApiException: I/O error reported by XML parser processing file:/<somepath>/intermediate.xml:
/<somepath>/intermediate.xml (No such file or directory)
(wobei SCHWERWIEGEND so etwas wie FATAL bedeutet). Daher ist die Datei intermediate.xml
wurde noch nicht geschrieben.
Dies ist die xpl
-Dokumente, die ich verwendet habe:
<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc"
xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0">
<p:input port="source">
<p:document href="first.xml"/>
</p:input>
<p:output port="result" sequence="true">
<p:empty/>
</p:output>
<p:xslt name="first-to-intermediate">
<p:input port="stylesheet">
<p:document href="first.xsl"/>
</p:input>
<p:input port="parameters">
<p:empty/>
</p:input>
</p:xslt>
<p:store href="intermediate.xml" />
<p:xslt>
<p:input port="source">
<p:document href="intermediate.xml"/>
</p:input>
<p:input port="stylesheet">
<p:document href="final.xsl"/>
</p:input>
<p:input port="parameters">
<p:empty/>
</p:input>
</p:xslt>
<p:store href="final.xml"/>
</p:declare-step>
Nur der Vollständigkeit halber: das sind die Transformationsdateien:
source.xml:
<root>
<element name="A" />
</root>
first.xsl:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="root">
<root>
<xsl:apply-templates/>
</root>
</xsl:template>
<xsl:template match="element">
<intermediate name="A" />
</xsl:template>
</xsl:stylesheet>
final.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="root">
<root>
<xsl:apply-templates/>
</root>
</xsl:template>
<xsl:template match="intermediate">
<final name="A" />
</xsl:template>
</xsl:stylesheet>
Hier ist ein Hinweis auf die tatsächliche Anwendung (die obigen Angaben sind natürlich eine Vereinfachung).
- Erster Schritt: Konvertierung der Quelle in etwas, das für meine Verarbeitung besser geeignet ist. Ausgabe:
companies.xml
- Nehmen Sie die Ausgabe aus Schritt 1 und erstellen Sie eine Indexdatei (
index.xml
) daraus. Die Indexdatei muss manuell editierbar sein. - Der dritte Schritt besteht darin, die in Schritt 1 und 2 erstellten Dateien zusammenzuführen und eine endgültige xml-Datei (
final.xml
)
Die Indexdatei muss auf die Festplatte geschrieben werden, und ich muss in der Lage sein, den letzten Schritt selbst auszuführen (das ist ein anderes Problem - dafür würde ich eine andere Pipeline schreiben)
Die Ausgabe von companies.xml
(Schritt 1) ist fakultativ, er kann im Speicher abgelegt werden (könnte aber sehr groß werden).