如何动态更改xsl:output方法属性值?

时间:2019-06-04 15:20:10

标签: xml xslt

我想使用相同的xslt并针对不同的输出(即xml,html,xhtml和text)进行测试;当然,我正在这样做:

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

OR

<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:output方法?

TIA

3 个答案:

答案 0 :(得分:2)

使用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 :(得分:2)

借助XSLT 3,您可以使用shadow属性和静态参数:

  <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 :(得分:1)

除了Messrs Honnen和Toro提供的答案外,许多XSLT处理器还允许您从API或命令行提供序列化参数。这些通常会覆盖样式表中的所有内容。例如,使用撒克逊人可以做到

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

!在某些shell中需要以\!的形式转义)