Этот вопрос проще описать в качестве примера, а не в виде текста.
Со следующим XML
<?xml version="1.0" encoding="UTF-8"?>
<tests>
<test>1</test>
<test>2</test>
</tests>
Если я запускаю следующий XSLT3
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
expand-text="true"
version="3.0">
<xsl:output method="xml" />
<xsl:mode on-no-match="shallow-copy" />
<!--<xsl:mode name="test" on-no-match="shallow-copy"/>-->
<xsl:template match="/">
<mytests>
<xsl:apply-templates/>
<xsl:apply-templates mode="test"/>
</mytests>
</xsl:template>
<xsl:template match="tests" mode="test">
<modetest>
<xsl:apply-templates mode="#current"/>
</modetest>
</xsl:template>
</xsl:stylesheet>
Я получаю следующий вывод в Saxon 9
<?xml version="1.0" encoding="UTF-8"?>
<mytests>
<tests>
<test>1</test>
<test>2</test>
</tests>
<modetest>
1
2
</modetest>
</mytests>
Вы можете видеть, что при использовании режима "test" мы не получаем вывод тестового элемента, только содержимое этих элементов. Не существует шаблона для элемента «test» с режимом «test».
Я бы догадался, что, поскольку нет совпадения, включился бы on-no-match = "shallow-copy" из режима xsl: без атрибута имени? Я предположил, что безымянный xsl: mode будет применяться ко всем несоответствиям, даже если режим действует (если другой xsl: mode не определен с именем, соответствующим текущему режиму). Если вы раскомментируете xsl: mode name = "test" on-no-match = "shallow-copy", тогда все работает как положено (поэтому обходного пути не требуется, спасибо), но это означает, что в XSLT с множеством примененных режимов -templates, мне нужно определить много-много именованных режимов xsl: просто для того, чтобы получить поведение шаблона идентификации.
Может кто-нибудь указать, если я делаю что-то не так или это ведет себя согласно w3 C Спецификация?