XSLT & XPath-Syntax>, wie auf ein Element in einem ‚äußeren‘ Rahmen verweisen

StackOverflow https://stackoverflow.com/questions/1843693

  •  12-09-2019
  •  | 
  •  

Frage

Ich habe die folgenden 100% richtig. Aber meine Neugier zu befriedigen ... ist es eine Möglichkeit, das gleiche zu erreichen, ohne die CurrentID Variable zu deklarieren? Gibt es eine Möglichkeit, es aus dem XPath „Test“ Zustand zu verweisen?

Die XPath-Abfrage in der Bedingung 2 verweisen @id sehen Attribute, wenn sie übereinstimmen.

  • der 'aktuell' @id
  • jeder 'Vorfahr' @id

Hier ist der Code:

<xsl:variable name="currentID" select="@id" />
<xsl:attribute name="class">
<xsl:if test="count($currentPage/ancestor::node [@id = $currentID])&gt;0">descendant-selected </xsl:if>
</xsl:attribute>
War es hilfreich?

Lösung

Da Sie die $currentID aus dem Kontextknoten auswählen:

<xsl:variable name="currentID" select="@id" />

können Sie die current() Funktion verwenden, die an den XSLT-Context-Knoten bezieht sich immer:

<xsl:attribute name="class">
  <xsl:if test="count($currentPage/ancestor::node[@id = current()/@id) &gt; 0]">
    <xsl:text>descendant-selected </xsl:text>
  </xsl:if>
</xsl:attribute>

Auf diese Weise kann eine Variable nicht benötigen.

Einige andere Hinweise:

  • Ich empfehle, mit <xsl:text> wie oben gezeigt. Dies gibt Ihnen mehr Freiheit, Ihren Code zu formatieren und zu vermeiden, zu lange Linien.
  • Sie brauchen kein count() > 0 zu tun, einfach die Knoten die Auswahl ist ausreichend. Wenn keine vorhanden sind, wird der leere Knotenmenge zurückgeführt. Es ergibt immer falsch, während nicht-leere Knotensätze immer auf true bewerten.

Wenn Sie Knoten durch @id regelmäßig in Ihrem XSL-Stylesheet verweisen, ein <xsl:key> würde von Vorteil:

<xsl:key name="kNodeById" match="node" use="@id" />

<!-- ... -->

<xsl:attribute name="class">
  <xsl:if test="key('kNodeById', @id)">
    <xsl:text>descendant-selected </xsl:text>
  </xsl:if>
</xsl:attribute>

Das oben gezeigte muss nicht current() da außerhalb eines XPath-Prädikat, der Kontext unverändert ist. Auch ich nicht die Knoten count(), da diese redundant ist (wie beschrieben).

Andere Tipps

Verwenden Strom () an dem aktuellen Knoten von der Vorlage verarbeitet vorgelegt:

<xsl:if test="count($currentPage/ancestor::node [@id = current()/@id])&gt;0">

Tim hat mir denken .... Ich glaube, ich war über die Dinge zu verkomplizieren, und ich versuchte, die folgende, die funktioniert.

<xsl:if test="@id = $currentPage/ancestor::node/@id">descendant-selected </xsl:if>

XSLT scheint glücklich ein Attribut mit einer Auswahl von Attributen Vergleichen und Bewerten wahr, wenn einer von ihnen passen? wenn jemand eine bessere Erklärung, warum dies funktioniert oder etwas besser (knapper) es dann niedergeschlagen.

Wie es bereits deutlich geworden, die sich auf die „äußeren Umfang“ war kein Problem, da man einen direkten Vergleich tun könnte das „=“ Operator. Allerdings gibt es einige Fälle, in denen Sie Strom tun müssen () und andere mehr, wo auch Strom () nicht schneiden (weil Sie müssen „join“ zwischen mehr als nur zwei Kontexten). In diesen Fällen XPath 2.0 ist „für“ Ausdrücke sind unverzichtbar.

Sie können einfach tun:

<xsl:if test="count($currentPage[ancestor::node/@id = @id])&gt;0">descendant-selected </xsl:if>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top