Announcement

Collapse
No announcement yet.

Pfad auslesen

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

  • Pfad auslesen

    Hallo,

    ich möchte den Pfad auslesen, an dem die XML-Datei liegt, auf die ich das XSLT-Script anwende.

    Gibt es hierfür Funktionen oder kann mir jemand eine Lösung dafür nennen?
    Ich möchte anschließend mit substring auf diesem Pfad arbeiten, weshalb sowas wie '../../' nicht funktioniert.

    Vielen Dank,

    Hauke

    //edit: Anmerkung: Ich kann kein XPATH 2.0 benutzen.

  • #2
    Wenn XPath 2.0 nicht benutzbar ist (fn:document-uri(/) böte sich an), könnte die Suche nach passenden Erweiterungsfunktionen für den eingesetzten Prozessor helfen. Eine Alternative wäre die Übergabe eines Parameters mit dem XML-Pfad an das Stylesheet.

    Comment


    • #3
      Das Thema ist gerade wieder aktuell bei mir =)

      Originally posted by Thomas Meinike View Post
      Wenn XPath 2.0 nicht benutzbar ist (fn:document-uri(/) böte sich an), könnte die Suche nach passenden Erweiterungsfunktionen für den eingesetzten Prozessor helfen. Eine Alternative wäre die Übergabe eines Parameters mit dem XML-Pfad an das Stylesheet.
      Ich weiß leider nicht was mit passenden Erweiterungsfunktionen für den eingesetzten Prozessor gemeint ist. Wo kann ich danach suchen?
      Die Übergabe eines Parameters mit dem XML-Pfad funktioniert auch nicht, da die XML-Dateien automatisch generiert werden und dies nicht so einfach möglich ist.

      Eine weitere Frage in diesem Zusammenhang ist: Kann ich irgendwie den Pfad auslesen an dem das XSLT-Script liegt?

      Danke!

      hauke

      Comment


      • #4
        Schau in der Doku des jeweiligen Prozessors nach einer eigenen document-uri()-Funktion. Mit XPath 2.0 kommt man so an die Stylesheet-URI: fn:document-uri(fn:document('')) und davon ausgehend an den Pfad. Bei XPath 1.0 bleibt wohl nur die Übergabe als Parameter.
        Zuletzt editiert von Thomas Meinike; 26.05.2008, 20:43.

        Comment


        • #5
          Nutze nun XSLT 2.0.
          Allerdings wollte ich nur den Pfad auslesen, und nicht zusätzlich den Dateinamen. Gibt es diese Möglichkeit?

          Ansonsten könnte man da vielleicht irgendwie mit einer String-Funktion arbeiten. Ich habe bereits etwas mit substring-before und substring herumgespielt, komme aber leider noch nicht auf eine Lösung.

          Bsp:
          Wenn meine XML an dem Pfad "C:\Hund\Katze\Maus\kaese.xml" liegt, möchte ich "C:\Hund\Katze\Maus" oder auch "C:\Hund\Katze\Maus\" herausbekommen.

          Gruß,

          hauke

          //edit: Die Länge der XML-Dateien variiert, weswegen man nicht einfach eine Konstante subtrahieren kann.
          Gibt es sowas wie subtring-before für das letzte Vorkommen des Zeichens?
          Zuletzt editiert von hneemann; 02.06.2008, 12:50.

          Comment


          • #6
            Ansatz:

            <xsl:variable name="pfad" select="'C:\Hund\Katze\Maus\kaese.xml'"/>

            <xsl:variable name="pfad1" select="fn:substring-before($pfad,fn:tokenize($pfad,'\\')[fn:last()])"/>
            <!-- C:\Hund\Katze\Maus\ -->

            <xsl:variable name="pfad2" select="fn:substring($pfad1,1,fn:string-length($pfad1)-1)"/>
            <!-- C:\Hund\Katze\Maus -->

            Comment


            • #7
              <xsl:variable name="pfad" select="'C:\Hund\Katze\Maus\kaese.xml'"/>

              <xsl:variable name="pfad1" select="fn:substring-before($pfad,fn:tokenize($pfad,'\\')[fn:last()])"/>
              <!-- C:\Hund\Katze\Maus\ -->
              Ich versuche das jetzt so, aber leider ist dann pfad1 leer.
              Woran kann das liegen? pfad scheint nicht leer zu sein.

              Ich versuche anschließend so weiterzuarbeiten:
              Code:
              <xsl:variable name="pathForDirectory" select="concat($pfad1, '\Elefant\Affe\', 'banane.xml')" />
              Als Fehlermeldung bekomme ich etwas in die Richtung:
              C:\Elefant\Affe\banane.xml existiert nicht (Was ja auch stimmt).


              Wenn ich nun $pfad1 durch pfad ersetze, gibt er mir etwa folgendes aus:
              C:\Hund\Katze\Maus\kaese.xml\Elefant\Affe\banane.x ml existiert nicht.

              Zur Erinnerung: Der richtige Pfad wäre
              C:\Hund\Katze\Maus\Elefant\Affe\banane.xml

              Gruß,

              Hauke

              Comment


              • #8
                Du nutzt wirklich einen XSLT 2.0-Prozessor? Dann funktioniert fn:tokenize() wie beschrieben.

                Comment


                • #9
                  Ich nutze den Saxon9.0.0.5 (C:\..\saxonsa9-0-0-5n\bin\Transform.exe)..trotzdem funktioniert da etwas nicht.

                  Nun geht er von dem Pfad aus, an dem die Stylesheet liegt und hängt Elefant\Affe\banane.xml dran. Das kann nur daran liegen, dass pfad1 leer ist meiner Meinung nach..
                  Wenn ich den Pfad "hardcodet" eingebe, funktioniert alles..

                  Gruß,

                  hauke

                  Comment


                  • #10
                    Ich versuche die Situation nocheinmal genau zu beschreiben:

                    Ich besorge mir den Pfad der Datei, auf die das Script angewendet wird:
                    <xsl:variable name="pathForData" select="fn:document-uri(/)" />
                    <!-- C:\Hund\Katze\Maus\kaese.xml-->

                    Dann schneide ich die XML ab:
                    <xsl:variable name="dataDirectory" select="fn:substring-before($pathForData,fn:tokenize($pathForData,'\\')[fn:last()])"/>
                    <!-- C:\Hund\Katze\Maus\-->

                    Anschließend kürze ich den Pfad manuell:
                    <xsl:variable name="pathWithoutData" select="substring($dataDirectory,1,string-length($dataDirectory)-5)" />
                    <!-- C:\Hund\Katze\-->

                    Nun deklariere ich eine Variable für den Pfad einer anderen XML, die an der Stelle "C:\Hund\Katze\Affe\banane.xml" steht:
                    <xsl:variable name="banane" select="concat($pathWithoutData, 'Affe\banane.xml')" />

                    Das Script liegt an der Stelle "C:\Tiger\Giraffe\script.xsl"
                    Wenn ich nun auf $banane zugreifen will, gibt er mir folgende Fehlermeldung:
                    FODC0005: Exception thrown by URIResolver: Could not find a part of the path "C:\Tiger\Giraffe\Affe\banane.xml"

                    Wenn ich die Zeile mit der Banane folgendermaßen ändere, das gleiche:
                    <xsl:variable name="banane" select="concat($dataDirectory, 'Affe\banane.xml')" />

                    Wenn ich allerdings die Zeile mit der Banane so ändere:
                    <xsl:variable name="banane" select="concat($pathForData, 'Affe\banane.xml')" />
                    Gibt er mir folgende Fehlermeldung aus:
                    FODC0005: Exception thrown by URIResolver: Could not find a part of the path "C:\Hund\Katze\Maus\kaese.xmlAffe\banane.xml"

                    Von daher denke ich, dass das an dem Tokenize liegt.

                    Der Kopf meines Stylesheets sieht so aus:
                    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
                    xmlns:exsl="http://exslt.org/common" xmlns:fn="http://www.w3.org/2005/xpath-functions"
                    exclude-result-prefixes="exsl">

                    Also habe ich auch da Version 2.0 angegeben. Vielleicht übersehe ich irgendwo eine Kleinigkeit, von daher wäre ich froh über eine weitere Rückmeldung.

                    Gruß, hauke

                    Comment


                    • #11
                      Ich verstehe nicht richtig, was Du da machst, aber schau mal an, was fn:tokenize() eigentlich produziert:

                      Code:
                      <xsl:variable name="pathForData" select="'C:\Hund\Katze\Maus\kaese.xml'" />
                      <xsl:value-of select="fn:tokenize($pathForData,'\\')"
                        separator="&lt;br&gt;" disable-output-escaping="yes"/>
                      <!-- ergibt: C:<br>Hund<br>Katze<br>Maus<br>kaese.xml -->
                      In $pathForData steht eine Sequenz, die sich auch über $pathForData[1] bis $pathForData[5] ansprechen lässt. Somit sollten weitere String-Zusammensetzungen recht einfach sein.

                      Comment


                      • #12
                        Ach, okay. Ich dachte da kommt dann schon der Pfad ohne die XML raus.

                        Ich weiß leider trotzdem noch nicht genau wie ich daraus den Pfad herleiten kann, da die Anzahl der Elemente vor der XML variabel ist.

                        Ich bräuchte in diesem speziellen Fall nur die ersten vier Elemente konkatenieren, aber wie mache ich das wenn ich nicht weiß, dass vor der XML genau vier Elemente stehen?

                        Gruß,

                        hauke

                        Comment


                        • #13
                          fn:tokenize() liefert eine Sequenz und darauf lässt sich fn:count() zum Zählen der getrennten Strings anwenden.

                          Comment


                          • #14
                            Sorry, ich sehe leider gerade irgendwie die Lösung noch nicht. Was kann ich dann mit der Anzahl anfangen?

                            Ich müsste ja alle Elemente außer dem letzten konkatenieren. Kann ich das am Besten mit einem Template machen und wenn, dann wie?

                            Comment


                            • #15
                              Ich kann dem Problem nicht mehr folgen. String-Verarbeitung ist so schwierig nicht und wurde hier auch schon reichlich behandelt.

                              Comment

                              Working...
                              X