Volkmar: Variable auslesen bzw. übergeben

Hi,

ich arbeite mit Apache FOP 0.20.3, erstelle aus einer XML Datei mit Hilfe eines XSL Stylesheets ein PDF. Klappt soweit ganz gut, aber eine Frage bereitet mir Kopfschmerzen.

An verschiendenen Stellen im XSL Stylesheet habe ich Pfadangaben einzutragen, um (in diesem speziellen Fall) einen Ordner für Bilder festzulegen. Wenn sich dieser Ordner mal ändert oder verschoben wird, habe ich 20 oder 30 Stellen im Stylesheet zu ändern, was natürlich wenig Sinn macht, viel zu lange dauert und außerdem ein hohes Fehlerrisiko birgt.

Meine Idee ist, am Beginn des XSL Sytlesheets eine Variable zu definieren, deren Wert im Prinzip der zu bestimmende Ordner sein soll. An all den anderen Stellen im Dokument greife ich jetzt nur noch auf diese Variable zu, muß also nur noch einmal etwas ändern.

Hier ein Auszug aus dem Quelltext der XSL Datei

<fo:table-cell height="70px">
   <xsl:variable name="PIC">
       <xsl:value-of select="PIC" />
     </xsl:variable>
   fo:block
<fo:external-graphic src="file:bilder/{PIC}" />
   </fo:block>
</fo:table-cell>

Anstelle des src="file:bilder/{PIC}" schwebt mir halt vor src="file:{Pfadvariable ausgelesen}{PIC}

Geht das? Wie geht das?

Danke für Hilfe im voraus...

Volkmar

  1. Hallo Volkmar,

    ich habe das gleiche Problem
    hier direkt aus der MSDN herauskopiert:
    (Leider klappt das bei mir nicht so ganz wie ich will)

    Man fügt vor der Transformation einen Parameter an und kann ihn dann im XSL Sheet später abfragen.

    Example:
    var xslt = new ActiveXObject("Msxml2.XSLTemplate.4.0");
    var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.4.0");
    var xslProc;
    xslDoc.async = false;
    xslDoc.load("sample.xsl");
    xslt.stylesheet = xslDoc;
    var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
    xmlDoc.async = false;
    xmlDoc.load("books.xml");
    xslProc = xslt.createProcessor();
    xslProc.input = xmlDoc;
    xslProc.addParameter("param1", "Hello");
    xslProc.transform();
    alert(xslProc.output);

    File Name: Sample.xsl

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
       <xsl:output method="html"/>
       <xsl:param name="param1"/>
      <xsl:template match="/">
          The parameter value was: <xsl:value-of select="$param1"/>
      </xsl:template>
    </xsl:stylesheet>

    ciao
    -Marco Wagner-

    1. Hi Marco,

      macht keinen rechten Sinn, weil ich dann doch trotzdem an verschiedenen Stellen ändern müßte, oder?

      Volkmar

      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
         <xsl:output method="html"/>
         <xsl:param name="param1"/>
        <xsl:template match="/">
            The parameter value was: <xsl:value-of select="$param1"/>
        </xsl:template>
      </xsl:stylesheet>

      ciao
      -Marco Wagner-

      1. Hi Volkmar,

        ich verstehe das Problem anscheinend noch nicht richtig.

        Möglichkeiten:

        a)Variable
        Man definiert eine Variable
        z.B.
        <xsl:variable name="Januar" select="document('2001/2001_01ZAHLVK.xml')"/>

        und kann dann im ganzen Skript die Variable "$Januar" einsetzen.
        Bei einer Änderung muss man nur die eine Definitionszeile oben korrigieren.

        oder z.B. (komplexer mit JScript)
        <msxsl:script language="JScript" implements-prefix="user"><![CDATA[
            function path_string_jan() {
              var path_str = "2001/2001_01ZAHLVK.xml";
              return path_str;
            }
        ]]> </msxsl:script>
        ...
        <xsl:variable name="Januar" select="document(user:path_string_jan())"/>

        b)Parameter
        Man bekommt einen Parameter übergeben (den Quellcode hab ich schon im ersten Posting drinnen)
        und kann dann mit "$Param1" den Parameter abfragen.
        So könnte man mit JavaScript o.ä. den Parameter auswerten und übergeben und im XSL Sheet wird einfach nur der Parameter benutzt ohne das irgendwelche Änderungen relevant wären.
        Änderungen müsste dann das "intelligente" Javascript auslesen, etc.

        c) Fazit:
        Hab ich jetzt was falsch verstanden ?
        oder hilft das wenigstens etwas ? :-)

        ciao
        -Marco Wagner-

        1. nneee, paßt jetzt schon. danke für die hilfe....

          gruß
          volkmar-

  2. Hallo Marco,

    Meine Idee ist, am Beginn des XSL Sytlesheets eine Variable zu definieren, deren Wert im Prinzip der zu bestimmende Ordner sein soll. An all den anderen Stellen im Dokument greife ich jetzt nur noch auf diese Variable zu, muß also nur noch einmal etwas ändern.

    Hier ein Auszug aus dem Quelltext der XSL Datei

    <fo:table-cell height="70px">
       <xsl:variable name="PIC">
           <xsl:value-of select="PIC" />
         </xsl:variable>
       fo:block
    <fo:external-graphic src="file:bilder/{PIC}" />
       </fo:block>
    </fo:table-cell>

    Anstelle des src="file:bilder/{PIC}" schwebt mir halt vor src="file:{Pfadvariable ausgelesen}{PIC}

    Du hast es doch fast:

    <xsl:variable name="Pfad">Pfadangabe</xsl:variable>

    <xsl:template match="/">

    <fo:external-graphic  src="{$Pfad}/DateinameOderanderes" />
        <xsl:value-of select="$Pfad"/>

    </xsl:template>
    Gruß
    Franz