生成文本时,XSLT会产生很好的缩进

时间:2012-08-09 13:01:41

标签: xml xslt xslt-1.0

我想创建一个XSLT-Transformation,它将xml文档转换为文本格式。这种文本格式是结构化的,因此应该相应地格式化,即缩进。

例如:

鉴于此文件,

<root>
    <l1>
        <l2>
            <l3>
                <l4>
                </l4>
            </l3>
            <l3>
                <l4>
                </l4>
            </l3>
        </l2>
    </l1>
</root>

我希望这是输出:

l1 (
    l3 (
        foo (
            l4 (
            )
        )
    )
    l3 (
        foo (
            l4 (
            )
        )
    )
)

如果有更多级别,它们应该缩进甚至更深。 xml文档的确切深度是可变的。另外,应该可以删除或添加某些节点,如节点“foo”和“l2”的示例中所示。

这是否可以使用xslt以可维护的方式实现?版本是xslt-1.0 with exslt。

的问候,
斯特

2 个答案:

答案 0 :(得分:2)

类似以下内容

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vSpaces" select=
 "'                                                                 '"/>

 <xsl:template match="*/*">
  <xsl:param name="pIndent" select="0"/>
     <xsl:value-of select="substring($vSpaces, 1, $pIndent)"/>
     <xsl:value-of select="concat(name(), ' (')"/>
     <xsl:text>&#xA;</xsl:text>
     <xsl:apply-templates select="*">
       <xsl:with-param name="pIndent" select="$pIndent+string-length(name())+3"/>
     </xsl:apply-templates>
     <xsl:value-of select=
     "substring($vSpaces, 1, $pIndent+ string-length(name()))"/>
     <xsl:text>)&#xA;</xsl:text>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<root>
    <l1>
        <l2>
            <l3>
                <l4>
                </l4>
            </l3>
            <l3>
                <l4>
                </l4>
            </l3>
        </l2>
    </l1>
</root>

生成正确缩进的输出

l1 (
     l2 (
          l3 (
               l4 (
                 )
            )
          l3 (
               l4 (
                 )
            )
       )
  )
  

另外,应该可以删除或添加某些节点,如   可以在示例中看到节点“foo”和“l2”。

在两次传递中组织转换,在第一次传递中,您将源XML文档转换为所需的最终XML文档。然后在第二遍中应用上述转换以产生想要的文本结果。

有关更多信息,请搜索“XSLT多次转换”。

答案 1 :(得分:0)

是的,您需要做的就是为每个迭代级别的输出预先添加一些选项卡/空格。