Domanda

Non sono sicuro se sto davvero facendo un errore o se questo è solo non funziona correttamente:

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

Se il nodo corrente è il primo figlio, o di genitore è il primo figlio, poi fare qualcosa di speciale.

Il problema è "parent :: position () = 1" .. con di .net XmlCompiledTransform ottengo

Prevista fine dell'espressione, trovato '(' ... sizione () = 1 o parent :: posizione -.> (<-. = 1

Ora, a quanto pare non così funzione di posizione () nella seconda parte, ma .. come faccio ad ottenere la posizione del genitore? Come posso, in generale, combino funzioni XPath con XPaths nei test?

È stato utile?

Soluzione

Buona domanda, 1.

È necessario definire cosa si intende per posizione del genitore .

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

è sempre true() quando esiste il nodo padre (è false() solo se il nodo del contesto è la / nodo del documento come questo nodo è il nodo principale nella struttura e non dispone di un genitore), perché ogni nodo in un albero (documento XML ben formato), per definizione, può avere al massimo un nodo padre.

Molto probabilmente, si desidera verificare che l'elemento principale è il primo nell'ordine del documento tra i suoi fratelli . Un modo per verificare questo è:

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

Quindi, il codice completo diventa :

<xsl:if test="position() = 1 or not(parent::node()/preceding-sibling::*)">        
   <!-- do something -->        
</xsl:if>        
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top