XSLT2: Как ссылаться на атрибуты о текущем узле в предикатах XPath2 - PullRequest
4 голосов
/ 28 октября 2011

Я отправил другой вопрос с одним из аспектов. Мне сказали прояснить вопрос, но этот вопрос уже был довольно длинным и сложным, поэтому я создал новый.

Я хочу знать, существует ли стандартный способ ссылки на атрибут узла current при проверке выражения XPath для другого.

В качестве примера рассмотрим следующий XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <xsl:for-each select="potato/stem[eye]">
        In session <xsl:value-of select="@sessionID"/>, the potato had <xsl:value-of select="/potato/stem[@sessionID=@sessionID][scc]/scc/@leafnumber"/> s.c.c. leaves.
    </xsl:for-each>
</xsl:template>

(источник XML в нижней части этого вопроса.) (Обратите внимание, что for-each ссылается на узлы типа stem [eye], но запрашиваемое второе значение ссылается на узлы типа stem [scc], которые находятся в другой ветви исходного XML-дерева.)

Теперь, очевидно, часть этого "@ sessionID = @ sessoinID" в большинстве случаев не имеет смысла, поскольку XPath воспринимает это как "значение атрибута sessionID узла должно равняться ... значению атрибута sessionID узла". . "

Но то, что я хочу сказать, это «Проверить, чтобы убедиться, что значение атрибута seesionID этого узла (значение в выражении XPath) совпадает с sessionID узла любого узла / stem [eye] узла I». я сейчас нахожусь. "

Я не могу сделать это с переменной, потому что вы не можете объявлять переменную в предложении for-each.

Для справки, это источник XML. Его структура - не то, что хотелось бы, а то, с чем мне приходится работать.

<?xml version="1.0" encoding="utf-8"?>
<potato>
<stem sessionID="1">
    <eye number = "25"/>
</stem>
<stem sessionID="3">
    <eye number = "33"/>
</stem>

<stem sessionID="1">
    <scc leafnumber = "234" />
</stem>
<stem sessionID="2">
    <scc leafnumber = "433"/>
</stem>
<stem sessionID="3">
    <scc leafnumber = "463"/>
</stem>

<stem sessionID="1">
    <agd leafnumber = "154"/>
</stem>
<stem sessionID="2">
    <agd leafnumber = "233"/>
</stem>
<stem sessionID="3">
    <agd leafnumber = "113"/>
</stem> 
</potato>

Вывод, который я ищу:

На первом сеансе картофель имел 234 с.с. листья.

На третьем занятии у картофеля было 463 с.с. листья.

(Конечно, это всего лишь пример песочницы. Я понимаю, что, возможно, есть простые способы выполнить вышеприведенный вывод совершенно другим способом, но я надеюсь, что этот пример натолкнется на мой вопрос, а именно, как использовать значения, связанные с текущий узел (скажем, в for-each) в предикате для XPath ищет другой.)

Ответы [ 2 ]

8 голосов
/ 28 октября 2011

В XSLT 1.0 вы можете использовать стандартную функцию current(), которая относится к узлу, которому соответствует текущий шаблон или самый внутренний xsl:for-each:

/potato/stem[@sessionID=current()/@sessionID][scc]/scc/@leafnumber

или путем определения ключа (на глобальном уровне):

<xsl:key name="kPotById" match="stem[scc]" use="@sessionID"/>

и ссылка на этот ключ:

key('kPotById', @sessionID)/scc/@leafnumber

В XSLT 2.0 / XPath 2.0 у вас есть дополнительные способы выразить это (переменные диапазона):

for $thisSessionID in @sessionId
 return
    /potato/stem[@sessionID=$thisSessionID][scc]/scc/@leafnumber
5 голосов
/ 28 октября 2011

Используйте, например, current()/@sessionID для доступа к атрибуту sessionID текущего обработанного узла (например, атрибута, обработанного для каждого в вашем образце или шаблонами применения с принудительной обработкой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...