Я не понимаю, как работает "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
элементов, что уже является ошибкой, поскольку атрибуты не имеют родителей.