2 Stimmen

XProc: Mehrfache XSLT-Transformation mit Zwischendateien

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

  1. Erster Schritt: Konvertierung der Quelle in etwas, das für meine Verarbeitung besser geeignet ist. Ausgabe: companies.xml
  2. Nehmen Sie die Ausgabe aus Schritt 1 und erstellen Sie eine Indexdatei ( index.xml ) daraus. Die Indexdatei muss manuell editierbar sein.
  3. 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).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X