如何在 xsl:output 的属性中访问 xsl:param



我想允许转换器在我的样式表中设置一个参数来指定需要多少个缩进空间。 我已经尝试了@Dimitre诺瓦切夫在这里的答案中的所有建议,但无济于事。

<xsl:param name="indent" select="0"/><!-- default indent is 0, but transformer could specify a different value -->
<xsl:output indent="yes" method="xml" omit-xml-declaration="yes" xalan:indent-amount="{$indent}"/> <!-- This does not work -->

如何将indent参数的值分配给xalan:indent-amount属性?

Xalan 似乎不支持 xalan:indent-amount 属性值的属性值模板。

我收到一条警告消息,指出 XSLT 1.0 中的 xsl:output 不支持属性值模板。显然,它们在 1.1 中受支持(不应使用,因为它已被 W3C 放弃),但 Xalan 似乎没有解析该特定属性中 AVT 中的参数值。

当我尝试在 AVT 中使用参数值时,它返回错误:

E For input string "{$indent}"

一种可能的解决方法是使用实体并生成 DTD。不要将缩进值作为参数传入,而是让 XSLT 引用 DTD。使用所需的缩进值生成 DTD 文件,然后调用 XSLT。

例如,创建一个这样的 DTD 文件(假设名为"in缩进.dtd"):

<!ENTITY indent "10" >

然后在 XSLT 中引用 DTD,如下所示(假设缩进.dtd位于同一文件夹中,或者您可以调整路径):

<!DOCTYPE xsl:stylesheet SYSTEM "indent.dtd">
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output indent="yes" method="xml" omit-xml-declaration="yes" 
               xalan:indent-amount="&indent;"/> 
</xsl:stylesheet>

另一种解决方法是首先生成具有所需xalan:indent-amount值的 XSLT,然后使用新生成的 XSLT 转换 XML。

正如@Mads Hansen已经说过的那样,Xalan似乎不支持xalan:indent-amount属性值的属性值模板。

我发现在变压器本身上设置属性确实有效。 这样做的好处是我不必创建/修改任何文件。

transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

功劳归@Flynn1179

最新更新