XPath: запрос атрибута из набора узлов в переменной - PullRequest
1 голос
/ 14 января 2010

В листе XSL у меня есть набор узлов в переменной $context.

Как правильно запросить атрибут самого верхнего узла в $ context? Очевидно, что если бы $ context был текущим узлом, я бы просто написал "@attname", но это не так. В настоящее время я делаю $context/../@attname, что мне не нравится.

EDIT

Хорошо, данные. Вот что я вижу в VS .

В случае, если вам интересно, как я получил эту странную вещь: я объединил узел с его подузлами и атрибутом, выбранным из другого узла:

<xsl:with-param name="context" select=". | ../@res" />.

Я не совсем понимаю, что из этого получается, но я вижу, что это работает. Выделенный - это интересующий меня атрибут.

Может быть, это создает атрибут, прикрепленный ни к чему, если это вообще имеет смысл: |

Ответы [ 3 ]

1 голос
/ 14 января 2010
$context/../@attname

не имеет особого смысла. Вы не можете идти "вверх" здесь, так как это приведет вас "вне" $context.

Если набор узлов содержит что-то вроде этого (один узел)

<node attname="foo">
  <bar />
</node>

, то:

$context/@attname

Если это так (список узлов):

<node attname="foo">
  <bar />
</node>
<node attname="foo">
  <bar />
</node>

, то:

$context[1]/@attname

Все это не работает, если переменная содержит фрагмент дерева результатов (RTF). В этом случае вам нужно использовать функцию расширения под названием node-set(). Большинство процессоров XSLT предоставляют эту функцию.


РЕДАКТИРОВАТЬ: ваша переменная содержит объединение текущего узла и узла обнаженного атрибута от его родителя:

<xsl:with-param name="context" select=". | ../@res" />

Результат объединения всегда будет в порядке документа, поэтому даже если вы выбрали атрибут после узла контекста в XPath, в результирующем наборе узлов он будет до - родительский узел узла контекста находится перед узлом контекста в порядке документа.

Вам нужно $context[1] для захвата узла атрибута и $context[2] для захвата другого узла.

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

 <xsl:with-param name="context" select="." />

и затем используйте $context/../@res в вызываемом шаблоне. Это было бы намного проще, чем то, что вы пытаетесь сейчас.

Кроме того, , если <xsl:with-param>, который вы здесь показываете, является частью <xsl:call-template>, вы можете полностью отбросить этот параметр. Когда шаблон вызывается (а не применяется), узел контекста не изменяется, передавая его излишне.

0 голосов
/ 16 января 2010

Поскольку у вас есть <xsl:with-param name="context" select=". | ../@res" />, атрибут 'res' является частью набора узлов (XPath 1.0) или последовательности (XPath 2.0), с которой связана переменная с именем 'context'. С XPath 2.0 вы можете использовать $context/self::attribute(res), но XPath 1.0 не имеет сравнимого выражения, так что то, что у вас уже есть ($context[1] или $context/../@res), это все, что вы можете сделать, на мой взгляд.

0 голосов
/ 14 января 2010

В дополнение к ответу Томалака, если вам когда-либо понадобится распространяться обратно в корень, вы можете попробовать:

ancestor::*[not(..)]

Хотелось бы услышать о ситуации, когда вам это может понадобиться / нужно.

Попробуйте сами, вставив:

//pet/ancestor::*[not(..)]

в этом онлайн инструменте проверки Xpath .

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