syntaxe XSLT et XPath> comment faire référence à un élément dans un champ « extérieur »

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

  •  12-09-2019
  •  | 
  •  

Question

Je suit travailler 100% correctement. Cependant, pour satisfaire ma curiosité ... est-il possible d'obtenir le même sans déclarer la variable currentId? Est-il possible de faire référence à partir de la condition Xpath « test »?

La requête XPath dans l'état doit se référer à 2 @id attributs pour voir si elles correspondent.

  • la @Id 'actuelle'
  • chaque 'ancêtre' @id

Voici le 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>
Était-ce utile?

La solution

Puisque vous sélectionnez le $currentID à partir du noeud contextuel:

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

vous pouvez utiliser la fonction current(), qui se réfère toujours au noeud contextuel XSLT:

<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>

De cette façon, vous n'avez pas besoin d'une variable.

Quelques autres notes:

  • Je recommande d'utiliser <xsl:text> comme indiqué ci-dessus. Cela vous donne plus de liberté pour formater votre code et éviter les lignes trop longues.
  • Vous n'avez pas besoin de faire un count() > 0, en sélectionnant simplement les nœuds est suffisante. Si aucune existe, l'ensemble de nœuds vide est renvoyée. Il évalue toujours faux, alors que des ensembles de noeuds non vides évaluent toujours vrai.

Si vous faites référence à des nœuds par @id régulièrement dans votre feuille de style XSL, un <xsl:key> deviendrait bénéfique:

<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>

Ce qui précède pas besoin current() depuis l'extérieur d'un prédicat XPath, le contexte ne change pas. En outre, je ne count() pas les noeuds, étant donné que cela est redondant (comme expliqué).

Autres conseils

Utilisation de courant () pour désigner le noeud courant traité par le modèle:

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

Tim m'a fait penser .... Je pense que je suis sur ce qui complique les choses, et j'ai essayé ceci qui fonctionne.

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

XSLT semble heureux comparer un attribut avec une sélection d'attributs et d'évaluer vrai si l'un d'eux correspond? si quelqu'un a une meilleure explication des raisons pour lesquelles cela fonctionne ou quelque chose de mieux (plus succinct) puis le mettre bas.

Comme il est déjà clair, se référant à la question n'était pas une « portée extérieure », puisque vous pouvez faire une comparaison directe avec l'opérateur « = ». Cependant, il y a des cas où vous avez besoin en cours () et plus en plus où même courant () ne coupe pas (entre plus que deux contextes parce que vous avez besoin de « rejoindre »). Dans ces cas, XPath 2.0 de "pour" les expressions sont indispensables.

Vous pouvez simplement faire:

<xsl:if test="count($currentPage[ancestor::node/@id = @id])&gt;0">descendant-selected </xsl:if>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top