Похоже, что этот вопрос ранее не обсуждался для стекового потока, за исключением Работа с вложенными предикатами XPath ... Уточнено , где было предложено решение, не включающее вложенные предикаты.
Итак, я попытался написать упрощенный образец того, что я хотел бы получить:
Введите:
<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>
Так, что я должен написать вместо этого ?????
?
Я знаю, что мог бы переписать всю таблицу стилей, используя еще один шаблон и обширное использование переменных / параметров, но это значительно усложняет даже эту таблицу стилей, не говоря уже о реальной таблице стилей, которая у меня есть для реальной проблемы.
В справочнике XPath написано, что знак .
означает текущий узел контекста, но он не сообщает, есть ли возможность получить узел контекста до этого; и я просто не могу поверить, что в XPath отсутствует эта очевидная особенность.