Вам просто нужно заново создать ключ, который использовался бы для узлов, которые вы хотите выбрать, и попытаться получить значения для этого ключа.Если набор, возвращенный для этого ключа, не содержит текущий узел, его следует выбрать.
Например, предположим, что ключи были созданы с использованием конкатенации значения атрибута class
каждого элемента и его строкового значения.Мы могли бы выбрать все элементы в документе, которые не имеют назначенной клавиши, используя следующее:
<xsl:apply-templates
select="//*[not(count(.|key('byClass', concat(@class, '|', .)))=
count(key('byClass', concat(@class, '|', .))))]"/>
Вот полная демонстрация:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="byClass" match="d" use="concat(@class, '|', .)"/>
<xsl:template match="/">
<xsl:apply-templates
select="//*[not(count(.|key('byClass', concat(@class, '|', .)))=
count(key('byClass', concat(@class, '|', .))))]"
mode="test"/>
</xsl:template>
<xsl:template match="*" mode="test">
<xsl:value-of
select="concat('Node ', local-name(),
' not assigned a key', '
')"/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
Применяется к этому входу:
<root>
<d class="test">1</d>
<d class="test">2</d>
<d class="something">1</d>
<q class="test">1</q>
</root>
Создает:
Node root not assigned a key
Node q not assigned a key
Обратите внимание, что ключ, создаваемый q
, является фактическим ключом, который отображается на группу узлов в документе, но этот элемент отсутствует в наборе.возвращается key('byClass', 'test|1')
, поэтому мы говорим, что этому узлу не был назначен ключ.
Обратите также внимание, что пустая строка (''
) является совершенно допустимым ключом, поэтому этого не происходитто, на что вы надеялись, будет:
<xsl:apply-templates select="*[key('kcWWPN', '')]"/>