Ключевой элемент XSLT: «использовать» родительский узел «матча» - PullRequest
3 голосов
/ 16 мая 2011

Я не могу понять это. Можно ли вообще иметь следующий ключ?

<xsl:key name="kMatchSentenceID_withTokId" match="sentences/sentence/@ID"
         use="--and here return the 'sentences' node--"/>

Я не понимаю, как работает "use", разве это не должно быть значением, которое вы возвращаете, когда совпадение было найдено?

Я вижу, что use="." возвращает значение атрибута в моем случае. (Почему? Это связано с матчем? Не должно . означать node()? А не node()/@)

Но самое главное, почему я не могу сделать что-то вроде этого: use="parent::sentence[@ID=name()]"

Как бы я поступил так? Мне нужно совпадение с @ID, но для возврата его родителя (точнее, идентификатора родителя).

Спасибо.

Ответы [ 3 ]

3 голосов
/ 16 мая 2011

Я не понимаю, как работает "use", разве это не должно быть значением, которое вы возвращаете, когда совпадение было найдено?

Нет, use делаетне указывайте ничего, чтобы быть " возвращено ".Начиная с спецификации :

Атрибут use - это выражение, определяющее значения ключа;выражение вычисляется один раз для каждого узла, соответствующего шаблону.

При отображении ключей на значения use указывает ключи - значения ключа на языке спецификации - иmatch указывает значения, которым будут сопоставлены эти ключи.Другими словами, match указывает что группировать, а use указывает как группировать их.

Скажем, вы хотели сгруппировать sentence элементы по@ID их родителей sentence.Вы можете сделать это следующим образом:

<xsl:key name="kMatchSentenceID_withTokId" match="sentences/sentence" 
         use="parent::*/@ID"/>

Ваше выражение не имеет смысла:

<xsl:key name="kMatchSentenceID_withTokId" match="sentences/sentence/@ID"
         use="parent::sentence[@ID=name()]"/>

... потому что оно пытается сгруппировать атрибуты ID по одному из их родительских sentence элементов, что уже является ошибкой, поскольку атрибуты не имеют родителей.

1 голос
/ 16 мая 2011

Вам немного сложно помочь, поскольку вы на самом деле не говорите, какую проблему вы пытаетесь решить.Но у вас, кажется, есть некоторая концептуальная путаница с ключами.Подумайте о них так: если вы хотите найти элементы E, которые имеют значение V для их свойства P, вам нужно определить ключ как <xsl:key name="N" match="E" use="P"/>, где P - выражение XPath, которое использует элемент E в качестве контекста.определяет стоимость рассматриваемого имущества;и тогда вам нужно назвать его как key('N', V).Выражение use может быть любым выражением XPath, которое вам нравится, и оно будет оцениваться с использованием соответствующего элемента E в качестве элемента контекста.

Приведенные вами примеры кажутся законными, но не очень полезными;неясно, на что вы надеялись, что они сделают.

1 голос
/ 16 мая 2011

Предполагая что-то вроде этого

<sentences id="parent">
  <sentence id="childa"/>
  <sentence id="childb"/>
</sentences>

Вам необходимо:

<xsl:key name="sentence" match="sentences" use="sentence/@id"/>

Тогда, например, XPath key('sentence','childa')/@id вернет 'parent'.

...