Использование xsl:key для хранения результата логического выражения

В моем преобразовании есть выражение, по которому неоднократно тестируются некоторые элементы. Чтобы уменьшить избыточность, я хотел бы инкапсулировать это в xsl:key, как это (не работает):

<xsl:key name="td-is-empty" match="td" use="not(./node()[normalize-space(.) or ./node()])" />

Ожидаемое поведение является ключом к получению логического значения true в случае успешного вычисления выражения и false в противном случае. Тогда я хотел бы использовать его следующим образом:

<xsl:template match="td[not(key('td-is-empty', .))]" />

Возможно ли это и если да, то как?


person hielsnoppe    schedule 20.12.2012    source источник


Ответы (1)


Я думаю, что в XSLT 1.0 значение ключа всегда имеет тип string, поэтому в вашем образце значением ключа может быть либо строка true, либо строка false. Затем вы можете вызвать key('td-is-empty', 'true'), чтобы найти все узлы элементов td, для которых выражение истинно, и key('td-is-empty', 'false'), чтобы найти все элементы td, для которых выражение ложно.

Однако вы, похоже, хотите сделать что-то по-другому со своим ключом, например, сохранить результат выражения use для каждого узла td на основе идентификатора узла. Я не думаю, что ключи работают в XSLT именно так.

[править] Однако вы можете выразить свое требование как

<xsl:template match="td[count(. | key('td-is-empty', 'false')) = count(key('td-is-empty', 'false'))]">...</xsl:template>

Это соответствует тем td элементам, которые входят в набор элементов, найденных key('td-is-empty', 'false').

person Martin Honnen    schedule 20.12.2012
comment
Спасибо! Похоже, у меня было некоторое непонимание того, как работают клавиши. Я попробую ваше предложение, но, вероятно, это не упростит мою помощь по коду, если только условие не станет более сложным. - person hielsnoppe; 21.12.2012