Кажется, что этот вопрос ранее не обсуждался в stackoverflow, сохранялся Работа с вложенными XPath Predicates... Refined, где предлагалось решение, не связанное с вложенными предикатами.
Итак, я попытался написать упрощенную модель того, что я хотел бы получить:
Input:
<root>
<shortOfSupply>
<food animal="doggie"/>
<food animal="horse"/>
</shortOfSupply>
<animalsDictionary>
<cage name="A" animal="kittie"/>
<cage name="B" animal="dog"/>
<cage name="C" animal="cow"/>
<cage name="D" animal="zebra"/>
</animals>
</root>
Вывод:
<root>
<hungryAnimals>
<cage name="B"/>
<cage name="D"/>
</hungryAnimals>
</root>
или, альтернативно, если нет пересечений,
<root>
<everythingIsFine/>
</root>
И я хочу получить его с помощью вложенных предикатов:
<xsl:template match="cage">
<cage>
<xsl:attribute name="name">
<xsl:value-of select="@name"/>
</xsl:attribute>
</cage>
</xsl:template>
<xsl:template match="/root/animalsDictionary">
<xsl:choose>
<!-- in <food> in <cage> -->
<xsl:when test="cage[/root/shortOfSupply/food[ext:isEqualAnimals(./@animal, ?????/@animal)]]">
<hungryAnimals>
<xsl:apply-templates select="cage[/root/shortOfSupply/food[ext:isEqualAnimals(@animal, ?????/@animal)]]"/>
</hungryAnimals>
</xsl:when>
<xsl:otherwise>
<everythingIsFine/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Итак, что я должен писать вместо этого ?????
?
Я знаю, что могу переписать всю таблицу стилей, используя еще один шаблон и широкое использование переменных /params, но делает эту таблицу стилей значительно более сложной, не говоря уже о реальной таблице стилей, которая у меня есть для реальной проблемы.
В документе XPath указано, что знак точки .
означает текущий контекст node, но он не указывает, есть ли какая-либо возможность получить node контекста до этого; и я просто не могу поверить, что XPath не хватает этой очевидной функции.