Что ж, надеюсь, очевидно, что ваш подход не работает: в XSLT 3.0 вы можете использовать переменную в шаблоне соответствия, но значение переменной должно быть набором узлов, а не выражением XPath для выбора этих узлов.
Чтобы оценить выражение XPath, представленное в виде строки, вам нужно xsl: define
<xsl:variable name="path-to-changed-nodes"
select="/t:root/t:Properties[@name='changed']" as="xs:string"/>
<xsl:variable name="changed-nodes" as="node()*">
<xsl:evaluate xpath="$path-to-changed-nodes"
context-item="/"/>
</xsl:variable>
<xsl:template match="$changed-nodes">
...
</xsl:template>
В Saxon для инструкции xsl:evaluate
требуется Saxon-PE или выше.Если вы не можете убедить кого-либо выдать вам лицензию Saxon-PE в качестве рождественского подарка, альтернативный подход заключается в реализации вашего решения в виде последовательности двух преобразований: сначала создайте таблицу стилей, содержащую необходимые шаблоны соответствия, а затем выполните эту таблицу стилей.
ПОЗЖЕ
Фактически в XSLT 3.0 существует более простая альтернатива генерации таблицы стилей в качестве источника XML;Вы можете использовать статические параметры и теневые переменные (хотя я не проверял это).
Начните с теневой переменной для шаблона совпадения:
<xsl:template _match="{$pattern}">...
Затем определите статическую переменную $ pattern:
<xsl:variable name="pattern" static="yes"
select="string($doc//t:root/t:Properties[@name='changed'])"/>
Затем объявите параметр $doc
:
<xsl:param name="doc" static="yes" as="document-node()"/>
и укажите значение для статического параметра doc при компиляции таблицы стилей.
У меня естьне знаю, сработает ли это с Saxon-HE 9.6 - вероятно, нет, поскольку это было сделано до завершения XSLT 3.0.