我想使用相同的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
答案 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"/>
答案 2 :(得分:1)
除了Messrs Honnen和Toro提供的答案外,许多XSLT处理器还允许您从API或命令行提供序列化参数。这些通常会覆盖样式表中的所有内容。例如,使用撒克逊人可以做到
java net.sf.saxon.Transform -s:in.xml -xsl:style.xsl !method=xhtml
(!
在某些shell中需要以\!
的形式转义)