



Ты имеешь ввиду
<xsl:template
match = "*[name() = $fullxpath]">
?
Это означает «соответствие любому элементу, но с условием, что его имя равно текстовому содержимому переменной fullxpath»
Как правило, это невозможно, вам нужно научиться различать атрибуты, которые позволяют XPath expression вычислять значение (например, select из xsl:value-ofhttps://www.w3.org/TR/xslt-30/#value-of), и атрибуты, которые являются patterns (например, match из xsl:templatehttps://www.w3.org/TR/xslt-30/#defining-templates).
Однако в XSLT 3 есть одна новая опция так называемых теневых атрибутов https://www.w3.org/TR/xslt-30/#shadow-attributes вместе со статическими параметрами https://www.w3.org/TR/xslt-30/#static-params:
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:xs = "http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes = "#all"
version = "3.0">
<xsl:param name = "pattern1" as = "xs:string" static = "yes" select = "'foo/bar'"/>
<xsl:mode on-no-match = "shallow-copy"/>
<xsl:template _match = "{$pattern1}"/>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/jyH9rMM
Как видите, для атрибута тени _match установлено значение статического параметра.
Другой, более сложный подход, который также возможен в XSLT 3 и Saxon 9.8 во всех редакциях или других совместимых реализациях XSLT 3, генерирует новую таблицу стилей по мере необходимости и выполняет ее с помощью функции transformhttps://www.w3.org/TR/xpath-functions/#func-transform. Вам необходимо сгенерировать код таблицы стилей в XSLT с другим пространством имен, которое вы можете связать с пространством имен XSLT:
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:xs = "http://www.w3.org/2001/XMLSchema"
xmlns:axsl = "http://www.w3.org/1999/XSL/Transform-Alias"
exclude-result-prefixes = "#all"
version = "3.0">
<xsl:param name = "pattern1" as = "xs:string" select = "'foo/bar'"/>
<xsl:namespace-alias stylesheet-prefix = "axsl" result-prefix = "xsl"/>
<xsl:variable name = "stylesheet">
<axsl:stylesheet version = "3.0">
<axsl:mode on-no-match = "shallow-copy"/>
<axsl:template match = "{$pattern1}"/>
</axsl:stylesheet>
</xsl:variable>
<xsl:template match = "/">
<xsl:sequence select = "transform(
map {
'source-node' : .,
'stylesheet-node' : $stylesheet
}
)?output"/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/jyH9rMM/2
спасибо за вклад. Вариант 1 с атрибутом тени работать не будет. поскольку значение не является статическим. Значение xpath будет передаваться из java динамически. Я еще не пробовал w3.org/TR/xpath-functions/#func-transform.
Статический параметр может быть установлен из Java перед запуском таблицы стилей. Не уверены, что означает «передается из java динамически», вызывает ли XSLT в Java, а Java возвращает это выражение XPath в виде строки?
Класс Java передает xpath в XSLT для использования в сопоставлении с шаблоном. Java transformer.setParameter("fullxpath",fullxpath); Я получил эту ошибку при попытке опробовать вариант 1 XPST0008: Variables (other than XSLT 3.0 static variables) cannot be used in a static
Я думаю, что если вы хотите установить статические параметры из Java с помощью Saxon 9.8, то это возможно с помощью saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/…, это означает, что вы используете s9api, а не JAXP API. Возможно, вы захотите добавить тег для Saxon, чтобы Saxonica / Майкл Кей ответил на ваш вопрос и предоставил вам более подробную информацию об использовании API.
@Ben, я также добавил пример использования XSLT 3 для генерации XSLT и выполнения его за одно преобразование на основе xsl:namespace-alias и функции transform из XPath 3.1.
@Mark Я получаю эту ошибку Element xsl:mode must not appear directly within xsl:stylesheet для '<axsl: mode on-no-match = "shallow-copy" />'. И если я удалю эту строку, элементы не появятся. На выходе отображается только текст внутри элемента.
Я опубликовал предложения, основанные на XSLT 3 и XPath 3.1, которые в настоящее время реализованы в мире Java с помощью Saxon 9.8 (доступны в версии HE с открытым исходным кодом на Sourceforge sourceforge.net/projects/saxon/files/Saxon-HE/9.8 и на Maven mvnrepository.com/artifact/net.sf.saxon/Saxon-HE), я не уверен, в каком контексте вы получаете эту ошибку но это не похоже на ошибку процессора XSLT 3. Если вы действительно используете Saxon 9.8 и получаете сообщение об ошибке с указанным выше предложением и не можете решить его самостоятельно, тогда лучше задайте новый вопрос со всеми деталями вашего кода и используемого вами программного обеспечения.
Спасибо, ваш пример преобразования был хорош. И помог мне решить мою проблему.
я имел в виду - вместо
<xsl:template match = "/abc/efg">хочу использовать<xsl:template match = "$fullxpath">, гдеfullxpath = /abd/efg