Announcement

Collapse
No announcement yet.

xml eingabedatei ergänzen und überschreiben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • xml eingabedatei ergänzen und überschreiben

    In einer unvollständigen xml-datei sollen vom Benutzer Daten eingetragen werden.
    Die xslt-Datei soll überprüfen, ob die fehlenden Daten vorhanden sind, wenn ja sollen aus den eingegebenen Daten neue Bäume berechnet werden, welche an die bisherige xml-datei angehängt werden sollen.

    Ich lese also eine xml-datei ein und möchte in die gleiche Datei ausgeben, dafür kopiere ich alles was bisher vorhanden ist und möchte das neue hinzufügen. Ist das generell unmöglich die Eingabedatei durch eine neue Ausgabedatei zu überschreiben?

    Fehlermeldung von saxon:
    SystemID: [...]\turnierplan.xsl
    Programmname: Saxon-EE 9.2.0.6
    Feherlevel: fatal
    Beschreibung: Cannot write to a URI that has already been read: file:[...]/turnierplan_eingabe.xml
    One cause may be that you are using 'result-document' instruction without specifying the value of the 'href' attribute and the main output file is not specified either.
    Problemcode:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" version="2.0" xml:base="turnierplan_eingabe.xml">  
        <xsl:output name="turnierplan_eingabe" version="2.0" method="xml" indent="yes"/>    
        
    <xsl:template match="/">
    <xsl:result-document href="turnierplan_eingabe.xml">
        <turnierplan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:noNamespaceSchemaLocation="turnierplan.xsd">
            <xsl:copy-of select="turnierplan/vorrunde"/>
            <xsl:if test="turnierplan/achtelfinale">
                <xsl:copy-of select="turnierplan/achtelfinale"></xsl:copy-of>
    <!-- usw. -->
    <xsl:choose>
                <xsl:when test="not(/turnierplan/achtelfinale)">
    <!-- mit den Berechnungen für die neuen Elemente -->

  • #2
    In einem Schritt kann man mit XSLT nicht dieselbe Datei lesen und schreiben. Wenn man eine Datei ersetzen oder überschreiben will, sollte man das mit Mitteln außerhalb von XSLT tun, programmatisch also per Shell-Script oder per Programmiersprache, für die es Schnittstellen beim benutzten XSLT-Prozessor gibt, mit Saxon 9 also Java oder (falls es die .NET-Version von Saxon ist) eine .NET Framework Sprache wie C# oder VB.NET.

    Comment


    • #3
      Die Lösung mit einer externen Programmiersprache würde meine Fähigkeiten übersteigen, daher wäre meine angestrebte Lösung mit einer xslt-Datei auszukommen, die erkennt in welcher der fünf Phase sich die Transformation befindet und dementsprechend den Dateinamen der Eingangs-XML und der Ausgangs-XML beeinflusst.

      Wünschenswert wäre eine Prioritätenliste für das einlesen der xml-datei nach folgendem Schema:
      1. Wenn turnierplan_halbfinale.xml existiert, dann wird diese eingelesen und erstellt turnierplan_finale.xml
      2. Wenn nicht und wenn turnierplan_viertelfinale.xml exisitert, dann wird diese genommen und erstellt turnierplan_halbfinale.xml
      3. Wenn nicht und wenn turnierplan_achtelfinale.xml existiert, dann wird diese genommen und erstellt turnierplan_viertelfinale.xml
      4. Wenn nicht, dann wird turnierplan_viertelfinale.xml aus der vorgegebenen xml-datei erstellt


      Ich weiß durchaus wie ich in einer eingelesenen Datei überprüfe ob Knoten vorhanden sind oder nicht, aber diese von mir angedachte Überprüfung verlangt ja, dass überprüft wird ob im aktuellen Arbeitsverzeichniss eine Datei mit einem bestimmten Namen vorhanden ist.
      Ist das überhaupt umsetzbar was ich mir hier vorstelle?

      Comment


      • #4
        Es gibt in XSLT und XPath 2.0 eine Funktion doc-available http://www.saxonica.com/documentatio...available.html, mit der kann man sicher testen, ob ein Dokument vorliegt (und als XML verarbeitet werden kann):
        Code:
        <xsl:template name="main">
          <xsl:choose>
            <xsl:when test="doc-available('turnierplan_halbfinale.xml')">
                <xsl:result-document href="turnierplan_finale.xml">
                   <xsl:apply-templates select="doc('turnierplan_halbfinale.xml')/*"/>
                </xsl:result-document>
            </xsl:when>
            ...
          </xsl:choose>
        </xsl:template>
        
        ...

        Comment

        Working...
        X