В некоторых хитрых случаях ответ Димитра (что, безусловно, является правильным подходом) может вести себя неожиданно. Например, если вы реорганизовали свой XSLT для использования шаблона идентификации (что вам следует), и вы создали такой шаблон:
<xsl:template match="Vehicle/TransportShiftNumber[. != '123']">
<EdiActivevehicle>
<xsl:value-of select="."/>
</EdiActivevehicle>
</xsl:template>
преобразование может по-прежнему создавать пустые EdiActivevehicle
элементы, если TransportShiftNumber
пусто.
Обычно, если несколько шаблонов соответствуют узлу, будет выбран более конкретный. «Более конкретный» обычно означает, что шаблоны с предикатом превзойдут шаблоны, которые этого не делают. (Фактические правила разрешения конфликтов более сложны; см. Раздел 5.5 рекомендации XSLT.) В этом случае и вышеприведенный шаблон, и шаблон с пустым элементом используют предикаты, и, следовательно, оба имеют одинаковый приоритет.
Таким образом, процессор XSLT сделает одну из двух вещей: он сообщит об ошибке (это разрешено, хотя я никогда не видел недружелюбный процессор XSLT), или он выберет шаблон, который появляется latest в таблице стилей.
Есть два способа это исправить. Либо поместите шаблон фильтрации пустых элементов внизу таблицы стилей, либо явным образом назначьте ему приоритет, превышающий 0,5 (что является значением по умолчанию для большинства шаблонов, имеющих предикаты):
Вероятно, я бы сделал последнее, потому что я обычно структурирую таблицы стилей, ожидая, что порядок шаблонов не будет значительным, и я не хочу никаких неприятных сюрпризов, если начну что-то менять. Но я бы обязательно добавил туда комментарий, объясняющий себя: я никогда не видел, чтобы кто-то на самом деле использовал явный приоритет для шаблона.