Использование 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', .))]" />

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

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'),

Другие вопросы по тегам