1

我想允许转换器在我的样式表中设置一个参数来指定需要多少缩进空间。我在这里的答案中尝试了@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属性?

4

2 回答 2

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>

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

于 2013-09-12T00:51:19.413 回答
1

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

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

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

归功于@Flynn1179

于 2013-09-12T19:06:43.150 回答