根据我的理解,我已经四处寻找了这个问题的答案,以下应该是可行的:
<xslt basedir="..." destdir="..." style="xslt-stylesheet.xsd" extension=".xml"/>
xslt样式表。XSD包含以下内容:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
不幸的是,虽然应用了大多数格式化(去掉空格,输入换行符等),但没有缩进,并且每个元素都沿着文件的左侧。这是Ant使用的xslt处理器的问题,还是我做错了什么?(使用Ant 1.8.2).
设置一些特定于处理器的输出选项可能会有所帮助,不过您应该注意,这些选项可能因所使用的XSLT处理器而异。
例如,如果使用Xalan,它定义了一个缩进量属性,默认值为0。
要在运行时重写此属性,可以在样式表中声明xalan名称空间,并在输出元素中使用特定于处理器的属性indent-amount
重写,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan">
<xsl:output method="xml"
encoding="UTF-8"
indent="yes"
xalan:indent-amount="2"/>
这个例子来自http://xml.apache.org/xalan-j/usagepatterns.html
上的Xalan使用模式文档。如果您碰巧使用Xalan,文档还说您可以通过设置更改文件org/apache/serializer/output_xml来全局更改所有输出首选项。序列化器jar中的属性。
为了完整性,在该文件(Xalan 2.7.1)中定义的特定于Xalan的xml输出属性的完整集合如下:
{http://xml.apache.org/xalan}indent-amount=0
{http://xml.apache.org/xalan}content-handler=org.apache.xml.serializer.ToXMLStream
{http://xml.apache.org/xalan}entities=org/apache/xml/serializer/XMLEntities
如果不使用Xalan,您可能会在XSLT处理器的文档中找到一些特定于处理器的输出属性
不同的XSLT处理器以不同的方式实现indent="yes"
。有些缩进是正确的,而另一些只是将元素的开头放在新的行上。您的XSLT处理器似乎属于后一类。
为什么会这样?
原因是W3C XSLT规范允许在缩进方面有很大的余地:
<"如果
indent
属性的值为yes
,则xml输出方法可以输出空白结果树(可能基于从源文档或样式表),以便缩进结果很好地;如果indent
属性的值为no
,则不应该这样做输出任何额外的空白。默认值为"no
"。xml输出方法应该使用一个算法来输出额外的空白这样可以确保从中删除空白时的结果使用[3.4空格剥离]中描述的过程输出的一组保留空白的元素当额外的空格输出为时,xsl:text
将相同当不输出额外的空白时注意:对于包含混合内容的元素类型的文档类型,通常使用
indent="yes"
是不安全的。"
可能的解决方案/strong>:
开始使用另一个XSLT处理器。例如,Saxon缩进得很好。
删除
<xsl:strip-space elements="*"/>
指令。如果源XML中有纯空白的文本节点,它们将被复制到输出中,这可能会产生更好看的缩进输出。
我不知道蚂蚁是否可以。但是关于XSLT:
在元素上使用copy-of
时,XSLT处理器不会缩进。如果像这样更改XSLT, XSLT处理器可能会设法缩进:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这个XSLT将遍历整个XML树并缩进它创建的每个元素。
编辑后注释:
你可以看到下面的问题来改变你的XSLT处理器,也许它会解决你的问题:如何用ant执行XSLT 2.0 ?
可以尝试在ant中添加{http://xml.apache.org/xslt}indent-amount
输出属性,如下所示:
<target name="applyXsl">
<xslt in="${inputFile}" out="${outputFile}" extension=".html" style="${xslFile}" force="true">
<outputproperty name="indent" value="yes"/>
<outputproperty name="{http://xml.apache.org/xslt}indent-amount" value="4"/>
</xslt>
</target>