Andi: dynamische variblen

Hallo,

ich versuche mittels XSLT XML- Dokumente in SVG umzuwandeln. Nun habe ich in SVG eine Javascript- Funktion geschrieben. Diese ermittelt die Länge eines Pfades in SVG. Es werden mehrere Pfade mit dem XSLT- Stylesheet gneriert. Daher gibt es Duplikate in den ID'S, die aber mit XSLT abgefangen werden. Das heisst es werden eindeutige ID's erzeugt.

Nun benötige ich aber diese ID's für die Java Script Funktion. Gibt es daher eine Möglichkeit dynamisch die ID's auszulesen?

Ich habe es mit document.getElementById versucht, wo man eine statische ID angeben kann. Damit funktioniert es, allerings nur mit einem Objekt.
Hier mal ein Quellcodeausschnitt:

function onInit(){
var objText = document.getElementById("obj_2_meta").firstChild.data;
var objSymbol=document.getElementById("obj_2_symbol1").firstChild.data;

"obj_2" wird innerhalb von XSLT erzeugt und "_meta" wird mitangehangen.

Die Tags, die ich auslesen möchte sehen wie folgt aus:

<metadata id="obj22_meta">obj_2</metadata>

Alles wird hier wie gesagt mit XSLT erzeugt und muss durch die Script Funktion dynamisch ausgelesen werden.
Wenn noch mehr Code benötigt wird, lasst es mich wissen.

Beste Grüße

Andi

  1. Hallo,

    Nun habe ich in SVG eine Javascript- Funktion geschrieben. Diese ermittelt die Länge eines Pfades in SVG.

    Dafuer gibt es im SVG-DOM die vorgefertigte Methode getTotalLength() fuer path-Objekte.

    Nun benötige ich aber diese ID's für die Java Script Funktion. Gibt es daher eine Möglichkeit dynamisch die ID's auszulesen?

    Abfrage von id-Attributwerten je nach Kontext: <xsl:value-of select="@id"/>

    Wenn noch mehr Code benötigt wird, lasst es mich wissen.

    Waere durchaus angebracht. Vielleicht sind die IDs gar nicht noetig und es laesst sich z. B. eine Gruppe definieren, die die path-Elemente kapselt. Der Zugriff waere dann mit getElementsByTagName() realisierbar.

    MfG, Thomas

    1. Hi Thomas,

      die Länge habe ich mit getTotalLength() ausgelesen und Die Variablen lese ich mit XSLT aus. Das funktioniert. Allerdings nur für ein Objekt, da ich in der Java Script Funktion den Namen des getElementById expilzit angebe.

      Hier kommt die JS- Funktion:
      <script type="text/ecmascript">

      function onInit(){

      var objText = document.getElementById("obj_2_meta").firstChild.data;
         var objSymbol = document.getElementById("obj_2_symbol1").firstChild.data;

      var pathElement = document.getElementById(objText );
         var pathLength = pathElement.getTotalLength();

      var textElement = document.getElementById("obj_2_testText");
         var textPath = document.getElementById("obj_2_testTextPath");
         textPath.setAttribute("xlink:href", "#"+objText);

      var tspan = document.getElementById("obj_2_tspanOh");
         tspan.setAttribute('letter-spacing', pathLength/80);

      var tspanText = tspan.getFirstChild();

      for(var i=0; i &lt; pathLength; i+=pathLength/80)
         {
          tspanText .appendData(objSymbol);

      }

      }
      </script>

      Das Template sieht wie folgt aus:

      <xsl:template name="meta">
         <xsl:param name="style1"/>
         <xsl:param name="symbol"/>
         <xsl:param name="dy"/>
         <metadata>
         <xsl:attribute name="id"><xsl:value-of select="@gml:id"/>xsl:text_meta</xsl:text></xsl:attribute><xsl:value-of  select="@gml:id"/>
        </metadata>
        <metadata>
         <xsl:attribute name="id"><xsl:value-of select="@gml:id"/>xsl:text_symbol1</xsl:text></xsl:attribute><xsl:value-of  select="$symbol"/>
        </metadata>
        <g>
         <xsl:attribute name="id">
           <xsl:value-of select="@gml:id"/>
           xsl:text_textAufPfad</xsl:text>
         </xsl:attribute>
         <text>
          <xsl:attribute name="id">
           <xsl:value-of select="@gml:id"/>
           xsl:text_testText</xsl:text>
          </xsl:attribute>
          <textPath>
           <xsl:attribute name="id">
            <xsl:value-of select="@gml:id"/>
            xsl:text_testTextPath</xsl:text>
           </xsl:attribute>
           <xsl:attribute name="xlink:href"></xsl:attribute>
           <tspan>
            <xsl:attribute name="id">
             <xsl:value-of select="@gml:id"/>
             xsl:text_tspanOh</xsl:text>
            </xsl:attribute>
            <xsl:attribute name="class">
             <xsl:value-of select="$style1"/>
            </xsl:attribute>
            <xsl:attribute name="dy">
             <xsl:value-of select="$dy"/>
            </xsl:attribute>
            xsl:text </xsl:text>
           </tspan>
          </textPath>
         </text>
        </g>
      </xsl:template>

      Die Textabschnitte nach den ID's sind nötig, da es somnst zum Konflikt kommt mit Pfaden, die die zuvor generiert werden. Diese hätten dann die gleiche ID.
      Ich hoffe der Code ist nicht allzu unübersichtlich....

      Beste Grüße
      andi

      Hallo,

      Nun habe ich in SVG eine Javascript- Funktion geschrieben. Diese ermittelt die Länge eines Pfades in SVG.

      Dafuer gibt es im SVG-DOM die vorgefertigte Methode getTotalLength() fuer path-Objekte.

      Nun benötige ich aber diese ID's für die Java Script Funktion. Gibt es daher eine Möglichkeit dynamisch die ID's auszulesen?

      Abfrage von id-Attributwerten je nach Kontext: <xsl:value-of select="@id"/>

      Wenn noch mehr Code benötigt wird, lasst es mich wissen.

      Waere durchaus angebracht. Vielleicht sind die IDs gar nicht noetig und es laesst sich z. B. eine Gruppe definieren, die die path-Elemente kapselt. Der Zugriff waere dann mit getElementsByTagName() realisierbar.

      MfG, Thomas

      1. Hallo,

        die Länge habe ich mit getTotalLength() ausgelesen und Die Variablen lese ich mit XSLT aus. Das funktioniert. Allerdings nur für ein Objekt, da ich in der Java Script Funktion den Namen des getElementById expilzit angebe.

        Dann verwende mehrere IDs, die sich aus dem XML-Dokumente im Ablauf der Transformation ergeben. position() bietet sich zur Generierung von Werten an, die an Zeichenketten angehaengt werden koennten.

        textPath.setAttribute("xlink:href", "#"+objText);

        Klappt das so? Hier sollte wegen dem Namespace-Prefix besser setAttributeNS() zum Einsatz kommen.

        var tspanText = tspan.getFirstChild();

        Bitte tspan.firstChild verwenden, getFirstChild() ist eine Erweiterungsmethode im ASV.

        for(var i=0; i &lt; pathLength; i+=pathLength/80)
           {

        Unter Verwendung eines <![CDATA[ ... ]]>-Abschnitts kann man das <-Zeichen direkt schreiben.

        <xsl:attribute name="id"><xsl:value-of select="@gml:id"/>

        Diese ID wird offenbar mehrfach zugewiesen, eine ID muss aber im Dokument eindeutig sein. Suche also einen Weg, der das ermoeglicht.

        MfG, Thomas

        1. Hallo,

          Dann verwende mehrere IDs, die sich aus dem XML-Dokumente im Ablauf der Transformation ergeben. position() bietet sich zur Generierung von Werten an, die an Zeichenketten angehaengt werden koennten.

          Die ID's werden durch @gml:id erzeugt. Ich habe dann je nach Nutzung des Objektes einen Text angehangen. Beispiel:

          obj_32_clip

          obj_32 ist hier das von XSLT ausgelesene. _clip der angehangene string.

          textPath.setAttribute("xlink:href", "#"+objText);

          Klappt das so? Hier sollte wegen dem Namespace-Prefix besser setAttributeNS() zum Einsatz kommen.

          Das hat bis jetzt so funktioniert. Denke der nimmt automatisch nen Standardnamespace.

          Den Rst habe ich geändert.

          <xsl:attribute name="id"><xsl:value-of select="@gml:id"/>

          Diese ID wird offenbar mehrfach zugewiesen, eine ID muss aber im Dokument eindeutig sein. Suche also einen Weg, der das ermoeglicht.

          Durch den angehangenen String ist die ID eindeutig. Allerdings müsst ich im Java Script diese auslesen. Problem ist nur, dass sie immer nur einmal vorkommt. Mein Aufruf in JavaScript müsst ich also so gestalten das er diesen immer ändert und alle Objekte mit diesem speziellen Stringanhängsel ausgelesen werden.. Wollt es mit regulären Ausdrücken machen ,hab es aber nciht hinbekommen.

          Beste Grüße

          andi

          1. Hallo,

            Durch den angehangenen String ist die ID eindeutig. Allerdings müsst ich im Java Script diese auslesen. Problem ist nur, dass sie immer nur einmal vorkommt. Mein Aufruf in JavaScript müsst ich also so gestalten das er diesen immer ändert und alle Objekte mit diesem speziellen Stringanhängsel ausgelesen werden.. Wollt es mit regulären Ausdrücken machen ,hab es aber nciht hinbekommen.

            Vielleicht hilft dieses Beispiel zur Separation von IDs mit identischen Teilzeichenketten.

            MfG, Thomas