给出以下XML文档:
<Include>
<Feature Title="A">
<Feature Title="1" />
<Feature Title="2" />
</Feature>
<Feature Title="B">
<Feature Title="3">
<Feature Title="i" />
<Feature Title="ii" />
</Feature>
<Feature Title="4" />
</Feature>
</Include>
我需要生成一个类似于:
的文本文件; Header
A
A/1
A/2
B
B/3
B/3/i
B/3/ii
B/4
我实现这一目标的最佳尝试是XSL样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<xsl:text>; Header


</xsl:text>
<xsl:apply-templates select="//Feature" /></xsl:template>
<xsl:template match="Feature">
<xsl:value-of select="@Title" /><xsl:text>

</xsl:text>
</xsl:template>
</xsl:stylesheet>
但是这会产生输出:
; Header
A
1
2
B
3
i
ii
4
如何在输出中显示所有级别的层次结构?
答案 0 :(得分:10)
此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="Include">
<xsl:text>; Header

</xsl:text>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="Feature">
<xsl:param name="pPrevious" select="''"/>
<xsl:value-of select="concat($pPrevious,@Title,'
')"/>
<xsl:apply-templates>
<xsl:with-param name="pPrevious" select="concat($pPrevious,@Title,'/')"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
输出:
; Header
A
A/1
A/2
B
B/3
B/3/i
B/3/ii
B/4
只是为了好玩,一行XPath 2.0:
concat('; Header

',
string-join(/Include//Feature/string-join(
ancestor-or-self::Feature/@Title,'/'),
'
')
)