Frage

Ich bin mir nicht sicher, ob ich wirklich einen Fehler mache oder ob dies einfach nicht richtig funktioniert:

<xsl:if test="position() = 1 or parent::position() = 1">
   <!-- do something -->
</xsl:if>

Wenn der aktuelle Knoten das erste Kind ist oder Eltern das erste Kind ist, dann machen Sie etwas Besonderes.

Das Problem ist "Eltern :: Position () = 1" .. mit .Nets xmlcompiledTransform bekomme ich

Erwartetes Ende des Ausdrucks, gefunden '('. ... SITION () = 1 oder Eltern :: Position-> (<-= 1.

Anscheinend mag es diese Position () im zweiten Teil nicht, aber wie bekomme ich die Position des Elternteils? Wie mache ich allgemein, kombinieren XPath funktioniert mit XPaths in Tests?

War es hilfreich?

Lösung

Gute Frage, +1.

Sie müssen definieren, was mit gemeint ist Position des Elternteils.

parent::node()[position() = 1] 

ist immer true() Wenn der übergeordnete Knoten existiert (ist false() Nur wenn der Kontextknoten der Dokumentknoten ist / Da dieser Knoten der obere Knoten im Baum ist und keinen übergeordneten) hat), da jeder Knoten in einem Baum (gut geformtes XML-Dokument) per Definition höchstens einen übergeordneten Knoten haben kann.

Höchstwahrscheinlich möchten Sie testen, dass das übergeordnete Element das erste in Dokumentreihenfolge unter seinen Geschwistern ist. Eine Möglichkeit, dies zu testen, ist:

not(parent::node()/preceding-sibling::*)

Der vollständige Code wird also:

<xsl:if test="position() = 1 or not(parent::node()/preceding-sibling::*)">        
   <!-- do something -->        
</xsl:if>        
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top