Frage

Ich habe eine Menge von Knoten

<menuList>
  <mode name="aasdf"/>
  <mode name="vfssdd"/>
  <mode name="aswer"/>
  <mode name="ddffe"/>
  <mode name="ffrthjhj"/>
  <mode name="dfdf"/>
  <mode name="vbdg"/>
  <mode name="wewer"/>
  <mode name="mkiiu"/>
  <mode name="yhtyh"/>
  and so on...
</menuList>

Ich habe es sortiert jetzt diese Art und Weise

 <xsl:variable name="rtf">
    <xsl:for-each select="//menuList/mode">
       <xsl:sort data-type="text" order="ascending" select="@name"/>
          <xsl:value-of select="@name"/>
    </xsl:for-each>
 </xsl:variable>

Jetzt brauche ich ein beliebiges Element im sortierten Feld an die Anzahl seiner Position zu bekommen. Ich verwende den Code:

<xsl:value-of select="exsl:node-set($rtf)[position() = 3]"/>

und ich bekomme eine Antwort Fehler. Wie soll ich es tun?

War es hilfreich?

Lösung

Es gibt mindestens zwei Fehler in dem mitgelieferten Code:

  1. <xsl:value-of select="@name"/>

Wenn mehr als ein benachbarter Textknoten vorhanden sind, werden sie zu einem zusammengefasst. Das Ergebnis ist, dass die RTF hat nur einen (langen) einzelne Textknoten, und es gibt keine dritten Knoten.

2. <xsl:value-of select="exsl:node-set($rtf)[position() = 3]"/>

Dies fordert der dritte Knoten in exsl:node-set($rtf) enthielt jedoch exsl:node-set($rtf) ist der Dokumentenknoten des temporären Baumes durch die exsl:node-set() Erweiterungsfunktion erzeugt - dies nur ein Knoten ist. Daher ist die obige XPath-Ausdruck nicht überhaupt etwas wählen.

Eine richtige Lösung ist die folgende: :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 >

 <xsl:template match="/">
    <xsl:variable name="rtf">
        <xsl:for-each select="//menuList/mode">
           <xsl:sort data-type="text" order="ascending" select="@name"/>
              <xsl:copy-of select="."/>
        </xsl:for-each>
     </xsl:variable>
    <xsl:value-of select="msxsl:node-set($rtf)/*[position()=3]/@name"/>
 </xsl:template>
</xsl:stylesheet>

Andere Tipps

Sie verwenden <xsl:value-of> in Ihren Variable. Dies kopiert nicht den Knoten, aber der String-Wert (der @name Attributwert des Knotens). Das heißt, Sie produzieren eine Variable, die eine verkettete Zeichenfolge enthält, aber nichts mit einer Struktur.

Versuchen Sie:

<xsl:variable name="rtf">
  <xsl:for-each select="//menuList/mode">
    <xsl:sort select="@name" data-type="text" order="ascending" />
    <xsl:copy-of select="."/>
  </xsl:for-each>
</xsl:variable>

Jetzt Ihre Variable enthält ein Fragment Ergebnisbaum aus <mode> Knoten in Ihrer bevorzugten Reihenfolge, was bedeutet, dass diese:

<xsl:value-of select="exsl:node-set($rtf)/*[3]/@name" />
<!-- don't forget you have element nodes now! ^^^^^^ -->

funktionieren würde. Beachten Sie auch, dass …/*[position() = 3] und …/*[3] ist die gleiche Sache.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top