我想创建一个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。
的问候,
斯特
答案 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>
</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>)
</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)
是的,您需要做的就是为每个迭代级别的输出预先添加一些选项卡/空格。