我想创建一个 XSLT 转换,它将 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 以可维护的方式是否可以做到这一点?版本是带有exslt的xslt-1.0。
问候
约斯特
如下所示:
<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 多遍转换"。
是的,您需要做的就是为每个迭代级别在输出前附加一些制表符/空格。