Konrad L. M. Rudolph: Nodes (per XPath) in Variable

Hallo Forum,

ich möchte per xsl:for-each Nodes enumerieren -- allerdings nicht Nodes aus dem ursprünglichen XML-Sheet, sondern aus dem XSL.

Ich habe folgendens probiert:

\\ <xsl:variable name="links">
    <li><a href="index.xhtml">Index</a></li>
    <li><a href="description.xhtml">Description</a></li>
</xsl:variable>
<ul>
    <xsl:for-each select="$links/li">
        <li>
            <xsl:if test="document/meta/section = .">
                <xsl:attribute name="class">active</xsl:attribute>
            </xsl:if>
            <xsl:apply-templates />
        </li>
    </xsl:for-each>
</ul>
///

leider klappt das nicht -- habe ich eigentlich auch erwartet.
Ich suche nun ein Workaround.

Hintergrund: ich habe mehrere Dateien, die mit einem XSL zu XHTML transformiert werden. Im XSL wird auch ein Menü definiert, mit einem Eintrag für jede Datei, und nun soll immer das korrespondierende Menüelement farbig markiert werden (class="active"). Dafür der if-Test. Ohne das for-each müßte ich für jeden Eintrag des Menüs einzeln prüfen, ob er aktiv sein soll.

Gruß,
KonRad -

--
"Was Gott zusammengeführt hat ..." :: polithink.org -
the politicultural e-zine :: http://www.polithink.org
  1. Hallo,

    <xsl:if test="document/meta/section = .">

    Hier ist dokument ein Element.
    Du brauchst aber die Funktion:

    <xsl:if test="document()/.../

    So: <xsl:if test="document()/meta/section = ."> wird es aber trotzdem nicht klappen, denn /meta/section erscheint mir noch immer ein Pfad im XML und nicht im XSL zu sein.
    Es müsste also, wenn du auf das XSL zugreifen willst in etwas so aussehen:
    <xsl:if test="document()/xsl:stylesheet/xsl:wasauchimmer">

    Ich habe trotzdem das Gefühl, dass dies nicht das ist was du eigentlich suchst, aber deine Informationen sind zu mehr nicht ausreichend.

    Grüße
    Thomas

    1. Hallo Thomas,

      <xsl:if test="document/meta/section = .">

      Hier ist dokument ein Element.
      Du brauchst aber die Funktion:

      <xsl:if test="document()/.../

      Sorry, Wieso eine Funktion? Der obige Test stimmt -- und funktioniert so auch. Ich will tatsächlich auf das Element document/meta/section zugreifen.

      Es müsste also, wenn du auf das XSL zugreifen willst in etwas so aussehen:
      <xsl:if test="document()/xsl:stylesheet/xsl:wasauchimmer">

      Anscheinend habe ich mich sehr zweideutig ausgedrückt ... der Pfad in "if" ist OK und bezieht sich aufs XML.

      Was sich aufs XSL bezieht, ist der Pfad der for-each-Enumeration (hatte ich eigentlich auch so geschrieben ...).

      Ich habe trotzdem das Gefühl, dass dies nicht das ist was du eigentlich suchst, aber deine Informationen sind zu mehr nicht ausreichend.

      Hmm, ich versuch's mal andersherum:

      Das XML sieht schematisch so aus:

      <document>
          <meta>
              <section>sektion</section>
          </meta>
          <data>
              <!-- hier befindet sich XHTML-Markup-Code -->
          </data>
      </document>

      Ich brauche nun im Prinzip folgendes im XSLT (Menüstruktur für die Seite):

      \\ <xsl:variable name="index">index</xsl:variable>
      <xsl:variable name="description">description</xsl:variable>
      <!-- ... und so weiter, für fünf oder sechs Elemente -->

      <ul>
          <li>
              <xsl:if test="document/meta/section = $index">
                  <xsl:attribute name="class">active</xsl:attribute>
              </xsl:if>
              <a href="index.html">Index</a>
          </li>

      <li>
              <xsl:if test="document/meta/section = $description">
                  <xsl:attribute name="class">active</xsl:attribute>
              </xsl:if>
              <a href="description.html">Description</a>
          </li>

      <!-- ... und so weiter, für fünf oder sechs Elemente -->
      </ul>
      ///

      D.h. es soll eine Liste erstellt werden und je nach dem Wert des Elements "document/meta/section" soll eines der Items mit dem Attribut {class="active"} versehen werden. Und da ich faul bin, will ich nicht für jedes Element einen solchen Code einfügen, sondern dachte, ich könne das eventuell mit einem for-each-Knoten erreichen, indem ich alle Elemente in eine Variable packe. Klappte ja nun nicht. Gibt es da eine andere Möglichkeit, den obigen Code ein wenig zu "elegantisieren"?
      Ok, man könnte "choose" statt "if" verwenden, aber wirklich besser wird's dadurch nicht.

      Gruß,
      KonRad -

      --
      "Was Gott zusammengeführt hat ..." :: polithink.org -
      the politicultural e-zine :: http://www.polithink.org
      1. Hallo,

        Anscheinend habe ich mich sehr zweideutig ausgedrückt

        Ja.

        ----------------------
        <xsl:variable name="links">
            <li><a href="index.xhtml">Index</a></li>
            <li><a href="description.xhtml">Description</a></li>
        </xsl:variable>
        <ul>
            <xsl:for-each select="$links/li">
                <li>
                    <xsl:if test="document/meta/section = .">
                        <xsl:attribute name="class">active</xsl:attribute>
                    </xsl:if>
                    <xsl:apply-templates />
                </li>
            </xsl:for-each>
        </ul>
        -----------------------

        Kann nicht gehen weil:
        <xsl:for-each select="$links/li"> zu <xsl:if test="document/meta/section = .">
        nichts ergibt.
        In $links/li hast du noch ein <a> und deshalb kann <xsl:if test="document/meta/section = ."> nie zustandekommen.

        Willst darauf zugreifen wäre natürlich ein
        <xsl:for-each select="document()//xsl:variable[@name = 'links']/li"> möglich.

        Aber ich würde an deiner Stelle einfach einen Template schreiben und die Klasse dann mit with-param bestimmen.

        Grüße
        Thomas

        1. Kann nicht gehen weil:
          <xsl:for-each select="$links/li"> zu <xsl:if test="document/meta/section = .">
          nichts ergibt.
          In $links/li hast du noch ein <a> und deshalb kann <xsl:if test="document/meta/section = ."> nie zustandekommen.

          Willst darauf zugreifen wäre natürlich ein
          <xsl:for-each select="document()//xsl:variable[@name = 'links']/li"> möglich.

          Hmm, bisher dachte ich eigentlich, "$links/li" sei eine Kurzform von "document()//xsl:variable[@name = 'links']/li".

          Aber ich würde an deiner Stelle einfach einen Template schreiben und die Klasse dann mit with-param bestimmen.

          Ok, das mache ich. Danke.

          Gruß,
          KonRad -

          --
          "Was Gott zusammengeführt hat ..." :: polithink.org -
          the politicultural e-zine :: http://www.polithink.org