Dans une liste simple (pas de groupes) cette expression XPath 1.0:
/persons/person[preceding-sibling::person[@name='f']]
[following-sibling::person[@name='g']]
S'il y a des groupes, cette expression XPath 1.0:
/persons
/person
[count(.|preceding-sibling::person[@name='f'][1]
/following-sibling::person[@name='g'][1]
/preceding-sibling::*) =
count(preceding-sibling::person[@name='f'][1]
/following-sibling::person[@name='g'][1]
/preceding-sibling::*)]
Dans XPath 2.0, vous pouvez utiliser pour les deux cas:
/persons/person[preceding-sibling::person[@name='f'][1]
/following-sibling::person[@name='g'][1] >> .]
Dans XSLT 1.0, vous pouvez utiliser:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="kPersonByMarks" match="person"
use="concat(generate-id(
preceding-sibling::person[@name='f'][1]),
'+',
generate-id(
following-sibling::person[@name='g'][1]))"/>
<xsl:template match="person[@name='f']">
<xsl:copy-of select="key('kPersonByMarks',
concat(generate-id(),'+',
generate-id(
following-sibling::person
[@name='g'][1])))"/>
</xsl:template>
</xsl:stylesheet>
Sortie:
<person name="b"></person>
Modifier: Correct "y compris" expression XPath 1.0 et XPath 2.0
+1 pour une réponse correcte. –