Не думаю, что вы можете выразить это одним выражением XPath 1.0.
В XSLT 1.0 я буду использовать ключи, и решение станет коротким, элегантным и эффективным :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="kVarCol2" match="variable[@col=2]" use="@row"/>
<xsl:template match="/*">
<xsl:for-each select="variable[@col='1'][key('kVarCol2', @row)='true']">
<xsl:sort select="@row" data-type="number"/>
<xsl:value-of select="concat('
', position(), ') ', .)"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к предоставленному документу XML (исправлено, чтобы сделать его правильно оформленным):
<clause code="section6">
<variable col="1" name="R1C1" row="1">Water</variable>
<variable col="2" name="R1C2" row="1">true</variable>
<variable col="1" name="R2C1" row="2">Gas</variable>
<variable col="2" name="R2C2" row="2"></variable>
<variable col="1" name="R3C1" row="3">Petrol</variable>
<variable col="2" name="R3C2" row="3">true</variable>
</clause>
желаемый, правильный результат получается :
1) Water
2) Petrol
II. Решение XPath 2.0 (для одного выражения):
for $i in 1 to max(/*/*/@row/xs:integer(.))
return
/*/variable[@row eq string($i)]
[@col eq '1'
and
../variable
[@row eq string($i)
and
@col eq '2'
and
. eq 'true'
]
]
/concat('
', position(), ') ', .)
Когда это выражение XPath 2.0 вычисляется в том же XML-документе (см. Выше), результатом будет та же искомая строка :
1) Water
2) Petrol