在 xsl 中根据 xml 深度插入空格
Posted
技术标签:
【中文标题】在 xsl 中根据 xml 深度插入空格【英文标题】:Insert blanks based on xml depth in xsl 【发布时间】:2018-08-16 19:41:31 【问题描述】:在生成用于将 XML 文件转换为文本输出的 XSL 模板方面需要帮助。 XML 文件如下所示。
<CP Txt="Text1">
<CP Txt="ABC">
<CP Txt="CDE">
<CP Txt="EFG"/>
<CP Txt="HIJ">
<CP Txt="KLM"/>
<CP Txt="NOP"/>
</CP>
</CP>
<CP Txt="QRS">
<CP Txt="TUV"/>
<CP Txt="WXY"/>
<CP Txt="Z01"/>
</CP>
</CP>
</CP>
预期输出如下。
Text1
ABC
CDE
EFG
HIJ
KLM
NOP
QRS
TUV
WXY
Z01
任何帮助或建议都会有所帮助。
提前致谢。
【问题讨论】:
【参考方案1】:您可以使用count(ancestor::*)
测试源树中元素的深度。
在 XPath 3.1 中,您可以使用 string-join((1 to $n)!" ")
输出 $n
空格。
在 XPath 2.0 中,您可以使用 for expression string-join(for $i in (1 to $n) return ' ')
输出 $n
空格
如果您只有 XPath 1.0,那就更难了;我会使用一个变量$spaces
,其中包含一个包含尽可能多的空格的字符串,然后使用substring($spaces, 1, $n)
。
在寻求 XSLT 帮助时,请务必说明您使用的是哪个版本,因为使用 XSLT 2.0 或更高版本的解决方案通常要简单得多。
【讨论】:
【参考方案2】:这是 2.0 版,请注明有问题的版本:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output indent="yes" method="text"/>
<xsl:template match="/">
<xsl:for-each select="descendant-or-self::*">
<xsl:call-template name="tab">
<xsl:with-param name="ancestor-count" select="count(ancestor::*)"/>
</xsl:call-template>
<xsl:value-of select="concat('', @Txt)"/><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template name="tab">
<xsl:param name="ancestor-count"/>
<xsl:for-each select="1 to $ancestor-count">
<xsl:text>	</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
对于 XSLT 1.0,您可以使用以下代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">
<xsl:output indent="yes" method="text"/>
<xsl:variable name="Tabs" select="'																																																																																																																																																																		'"/>
<xsl:template match="/">
<xsl:for-each select="descendant-or-self::*">
<xsl:value-of select="substring-after($Tabs, substring($Tabs, count(ancestor::*)+1))"/>
<xsl:value-of select="@Txt"/><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
注意:如果您的 xml 嵌套更多,您必须使用选项卡实体更新变量选项卡。
【讨论】:
见提到的链接:xsltfiddle.liberty-development.net/3NzcBth/30 感谢 @Amerndra 的帮助...我正在查看 Version2.0 并有一个更快速的问题。如果 XML 的格式为以上是关于在 xsl 中根据 xml 深度插入空格的主要内容,如果未能解决你的问题,请参考以下文章