Как динамически изменить значение атрибута метода xsl: output? - PullRequest
0 голосов
/ 04 июня 2019

Я хочу использовать один и тот же xslt и проверять разные выходные данные, то есть xml, html, xhtml и text;Конечно, я делаю это:

<xsl:output method="xml" indent="yes"/>

ИЛИ

<xsl:output method="html" indent="yes"/>

Но я хочу динамически изменять через параметр с сообщением, по умолчанию xml, если я его опускаю.

Я попробовал это:

<xsl:param name="outputMethod" select="xml" />  
<xsl:output method="$outputMethod"indent="yes"/>

Безуспешно, вывод:

 XTSE0020: Invalid value for serialization method: must be
  xml|html|xhtml|text|json|adaptive, or a QName in '{uri}local' form

и попробовал это гораздо более запутанным способом, я знаю:

<xsl:variable name="thisDocument" select="document('')" /> 
<xsl:param name="outputMethod" select="xml" />  
<xsl:variable name="myOutputMethod" select="$outputMethod"/>
<xsl:output method="$thisDocument/xsl:stylesheet/myOutputMethod" indent="yes"/>

Безуспешно, вывод:

Static error at xsl:output on line 10 column 85 of CopyingNodes.xslt:
  XTSE0020: Both the prefix {$thisDocument/xsl} and the local part
  {stylesheet/myOutputMethod} are invalid
Errors were reported during stylesheet compilation

Итак, есть какие-нибудь исправления?предложения?

Или невозможно динамически изменить метод вывода xsl:

TIA

Ответы [ 3 ]

2 голосов
/ 04 июня 2019

С XSLT 3 вы можете использовать атрибут тени и статический параметр:

  <xsl:param name="output-method" as="xs:string" static="yes" select="'html'"/>

  <xsl:output _method="{$output-method}" indent="yes"/>

https://xsltfiddle.liberty -development.net / 3NJ38ZF / 1

2 голосов
/ 04 июня 2019

Использование xsl:result-document:

<xsl:param name="method" select="'xml'"/>

<xsl:output indent="yes"/>

<xsl:template name="xsl:initial-template">
   <xsl:result-document method="{$method}">
      <!-- your code here -->
   </xsl:result-document>
</xsl:template>
1 голос
/ 04 июня 2019

Как и ответы, предоставленные господами Хонненом и Торо, многие процессоры XSLT позволяют вам передавать параметры сериализации из API или командной строки;они обычно переопределяют что-либо в таблице стилей.Например, с Saxon вы можете сделать

java net.sf.saxon.Transform -s:in.xml -xsl:style.xsl !method=xhtml

(в некоторых оболочках ! необходимо экранировать как \!)

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