如何让xslt缩进xml(来自Ant)?

时间:2011-12-21 10:38:59

标签: ant xslt

根据我的理解,我已经四处寻找答案,以下内容应该有效:

<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)。

4 个答案:

答案 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"通常是不安全的。“

可能的解决方案

  1. 开始使用其他XSLT处理器。例如,Saxon缩进很好。

  2. 删除<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>