XSLT Filterung und Indizes auf node set
Frage
Ich bin versucht zu retreive den vorherigen Knoten in ein für-jede mit der vorhergehenden-sibling-Achse, einem filter und einem indexer, um es zu finden.
Das problem ist, ich will nur das erste Element mit dem angegebenen XPath-Selektor aber ich scheine nicht in der Lage anwenden der filter und der indexer.Der indexer scheint zu überschreiben Sie die filter so bekomme ich immer die erste vorhergehenden Geschwister eher als die erste, die den Filterkriterien entsprechen.
Ich habe versucht, indem Sie diese in eine variable innerhalb der foreach-aber da die variable nicht geändert werden, die Knotenmenge ist immer das zweite Element der vorhergehenden Geschwister-Werte.
Hier ist der relevante code (gehackt, so viel Lärm wie möglich).Wir entschuldigen uns für die umbraco-Rauschen (die XSLT-Datei wird zum erzeugen einige ziemlich komplizierte markup für eine subnav, die ich nicht ändern kann problemlos).
<xsl:for-each select="$currentPage/ancestor-or-self::node[(@nodeTypeAlias='Discover' or @nodeTypeAlias='CampaignHome') and data[@alias='umbracoNaviHide'] != 1]/child::node[(@nodeTypeAlias='Discover' or @nodeTypeAlias='CampaignHome') and data[@alias='umbracoNaviHide'] != 1]">
<!--This variable is always set to the second item's preceding sibling-->
<xsl:variable name="precedingItem" select="preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]]" />
<!--This variable always contains the second item even if /data/@alias='umbracoNaviHide' = 1 -->
<xsl:variable name="predingItemWithIndexer" select="preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]][1]" />
<!-- this always prints out the id of the first item -->
<xsl:value-of select="position()" /> <xsl:value-of select="$precedingItem[1]/@id" />
</xsl:foreach>
Ich würde die zweite Auswahl der inline-aber da der indexer-filter überschreiben, die andere filter-es gibt nicht die korrekten Werte, wenn umbracoNaviHide = 1.
Lösung
preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]]
Dies bedeutet: wählen Sie alle vorherigen Geschwister node
Elemente mit mindestens einem Kind data
element ohne alias
Attribut oder mit einem alias
Attribut nicht gleich "umbracoNaviHide"
BEARBEITEN:Dies ist der korrekte XPath für dieses:
Ich wollte die erste vorhergehenden Knoten element, das enthält ein Daten-element hat ein Attribut Aliasname umbracoNaviHide, welche nicht enthalten der Wert 1.
preceding-sibling::node[data[@alias='umbracoNaviHide']!=1][1]