XSL: передать строковое значение в шаблон - PullRequest
0 голосов
/ 06 сентября 2018

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

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

<xsl:template
      match="$fullxpath">

Это работает

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

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

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

В целом это невозможно, вам нужно научиться различать атрибуты, которые позволяют XPath expression вычислять значение (например, select из xsl:value-of https://www.w3.org/TR/xslt-30/#value-of) и атрибуты, которые patterns (например, match из xsl:template https://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, при необходимости генерирует новую таблицу стилей и выполняет ее с помощью функции transform https://www.w3.org/TR/xpath-functions/#func-transform. You необходимо создать код таблицы стилей в 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

0 голосов
/ 06 сентября 2018

Вы имеете в виду

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...