根据我的理解,我已经四处寻找答案,以下内容应该有效:
<xslt basedir="..." destdir="..." style="xslt-stylesheet.xsd" extension=".xml"/>
其中xslt-stylesheet.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>
不幸的是,虽然应用了大多数格式(空格被剥离,输入了换行符等),但缩进不是,并且每个元素都位于文件的左侧。这是xslt处理器Ant使用的问题,还是我做错了什么? (使用Ant 1.8.2)。
答案 0 :(得分:5)
设置某些特定于处理器的输出选项可能会有所帮助,但您应该注意,这些选项可能因您使用的XSLT处理器而异。
例如,如果你使用的是Xalan,它会定义一个indent-amount属性,它似乎默认为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,文档还说你可以通过设置更改序列化器jar中的文件org / apache / serializer / output_xml.properties来全局更改所有输出首选项。
为了完整性,在该文件(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处理器的文档中寻找一些特定于处理器的输出属性,这很幸运
答案 1 :(得分:1)
不同的XSLT处理器以不同的方式实现indent="yes"
。有些缩进正确,而其他只是将元素放在一个新行上。您的XSLT处理器似乎属于后一组。
为什么会这样?
原因是 W3C XSLT Specification 允许在缩进中产生显着的余地:
“如果
indent
属性的值为yes
,则为xml输出 方法可能输出空格以及空格中的空格 结果树(可能基于从任何一个中剥离的空白) 源文档或样式表)以缩进结果 很好;如果indent
属性的值为no
,则不应该 输出任何额外的空格。默认值为no
。 xml 输出方法应该使用算法输出额外的空格 确保如果要删除空格的结果 使用[3.4空白剥离]中描述的过程输出 用一组由空格保留的元素组成的 当输出额外的空格时,xsl:text
将是相同的 当没有输出额外的空格时。注意:对于包含混合内容的元素类型的文档类型,使用
indent="yes"
通常是不安全的。“
可能的解决方案:
开始使用其他XSLT处理器。例如,Saxon缩进很好。
删除<xsl:strip-space elements="*"/>
指令。如果源XML中只有空白文本节点,它们将被复制到输出中,这可能会产生更好看的缩进输出。
答案 2 :(得分:0)
我不知道蚂蚁是否正常。但关于你的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处理器,也许它可以解决您的问题:How to execute XSLT 2.0 with ant?
答案 3 :(得分: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>