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