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

时间:2013-09-11 22:11:36

标签: xslt

我想允许变换器在我的样式表中设置一个参数,以指定需要多少个缩进空格。我已经在答案here中尝试了@Dimitre Novatchev的所有建议,但无济于事。

<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属性?

2 个答案:

答案 0 :(得分:2)

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文件(假设命名为“indent.dtd”):

<!ENTITY indent "10" >

然后在你的XSLT中像这样引用DTD(假设indent.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。

答案 1 :(得分:1)

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

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

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

Credit goes to @Flynn1179