我想允许变换器在我的样式表中设置一个参数,以指定需要多少个缩进空格。我已经在答案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
属性?
答案 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");