XSL: передать строковое значение в соответствие с шаблоном

Я хочу передать строку xpath из java в шаблон XSL. Я пробовал эти

<xsl:template
      match = "string($fullxpath)">

<xsl:template
      match = "$fullxpath">

Это работает

xpath value: <xsl:text/>
      <xsl:value-of select = "$fullxpath" />

Но совпадение не получается. Помоги пожалуйста !!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
199
2

Ответы 2

Ты имеешь ввиду

<xsl:template
      match = "*[name() = $fullxpath]">

?

Это означает «соответствие любому элементу, но с условием, что его имя равно текстовому содержимому переменной fullxpath»

я имел в виду - вместо <xsl:template       match = "/abc/efg"> хочу использовать <xsl:template       match = "$fullxpath">, где fullxpath = /abd/efg

Ben 06.09.2018 16:57

Как правило, это невозможно, вам нужно научиться различать атрибуты, которые позволяют 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.

Ben 06.09.2018 17:19

Статический параметр может быть установлен из Java перед запуском таблицы стилей. Не уверены, что означает «передается из java динамически», вызывает ли XSLT в Java, а Java возвращает это выражение XPath в виде строки?

Martin Honnen 06.09.2018 17:46

Класс Java передает xpath в XSLT для использования в сопоставлении с шаблоном. Java transformer.setParameter("fullxpath",fullxpath); Я получил эту ошибку при попытке опробовать вариант 1 XPST0008: Variables (other than XSLT 3.0 static variables) cannot be used in a static

Ben 06.09.2018 17:57

Я думаю, что если вы хотите установить статические параметры из Java с помощью Saxon 9.8, то это возможно с помощью saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/…‌, это означает, что вы используете s9api, а не JAXP API. Возможно, вы захотите добавить тег для Saxon, чтобы Saxonica / Майкл Кей ответил на ваш вопрос и предоставил вам более подробную информацию об использовании API.

Martin Honnen 06.09.2018 18:10

@Ben, я также добавил пример использования XSLT 3 для генерации XSLT и выполнения его за одно преобразование на основе xsl:namespace-alias и функции transform из XPath 3.1.

Martin Honnen 06.09.2018 19:03

@Mark Я получаю эту ошибку Element xsl:mode must not appear directly within xsl:stylesheet для '<axsl: mode on-no-match = "shallow-copy" />'. И если я удалю эту строку, элементы не появятся. На выходе отображается только текст внутри элемента.

Ben 07.09.2018 17:37

Я опубликовал предложения, основанные на 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 и получаете сообщение об ошибке с указанным выше предложением и не можете решить его самостоятельно, тогда лучше задайте новый вопрос со всеми деталями вашего кода и используемого вами программного обеспечения.

Martin Honnen 07.09.2018 18:24

Спасибо, ваш пример преобразования был хорош. И помог мне решить мою проблему.

Ben 09.09.2018 03:25

Другие вопросы по теме