La soluzione attualmente selezionato:
//comment()/following-sibling::*[1]/self::item
non funziona nel caso in cui v'è un'istruzione procesing (o un intero gruppo di istruzioni di elaborazione) tra il commento e l'elemento - come notato in un commento di Martin Honnen.
La soluzione seguente non presenta un problema.
La seguente espressione XPath seleziona solo elementi nodi che sono o immediatamente preceduti da un nodo di commenti, o sono immediatamente preceduti da un nodo di testo bianco-spazio-only, che viene immediatamente preceduto da un nodo di commenti:
(//comment()
/following-sibling::node()
[1]
[self::text()
and
not(normalize-space())
]
/following-sibling::node()
[1] [self::item]
)
|
(//comment()
/following-sibling::node()
[1]
[self::item]
)
Ecco un test completo:
usiamo questo documento XML:
<root>
<list>
<!-- foo's comment -->
<item name="foo" />
<item name="bar" />
<!-- another foo's comment -->
<item name="another foo" />
<!-- comment 3 --><item name="immed.after 3"/>
<!-- comment 4 --><?PI ?><item name="after PI"/>
</list>
</root>
Quando la seguente trasformazione viene applicata sul documento sopra XML:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"
(//comment()
/following-sibling::node()
[1]
[self::text()
and
not(normalize-space())
]
/following-sibling::node()
[1] [self::item]
)
|
(//comment()
/following-sibling::node()
[1]
[self::item]
)
"/>
</xsl:template>
</xsl:stylesheet>
The Wanted, risultato corretto è prodotto:
<item name="foo"/>
<item name="another foo"/>
<item name="immed.after 3"/>
fonte
2010-04-10 15:19:57
Si noti che nel modello di dati XSLT/XPath quegli elementi voce stai cercando un non preceduto immediatamente da un nodo di commento ma piuttosto da un nodo di testo con uno spazio bianco. Quindi, a meno che non si usi ' ' nei propri fogli di stile, questi nodi di testo dello spazio bianco possono interferire. –
Buona domanda (+1). Vedi la mia risposta per l'unica (al momento) soluzione completa. I commenti di Martin Honnen sono corretti e sebbene la risposta attualmente selezionata possa funzionare per voi, potrebbe improvvisamente smettere di farlo (se il motore XPath viene fornito con un documento XML, i cui nodi solo nello spazio bianco non vengono rimossi). –