好的...标题是正确的...
我不想要平面列表中的层次结构,而是完全相反
我有一个文件夹类,其中包含由属性Children
保存的文件夹列表。所以这是一个典型的层次模型。
我现在想展平这个列表...这将是一个预购遍历,即
假设
A
- A.1
----- A.1.1
----- A.1.2
- A.2
----- A.2.1
- A.3
B
- B.1
- B.2
----- B.2.1
----- B.2.2
----------- B.2.2.1
----------- B.2.2.2
从这个层次结构中,我期望的平面列表与上面显示的顺序完全相同!
如果 LINQ 无法做到这一点,那么 XSLT 能否将其扁平化为 xml 元素列表?
最佳答案
If LINQ cant do this then can an XSLT make it flat into a list of xml-elements?
有几个人已经展示了如何使用 LINQ 执行此操作。
这是一个简短的 XSLT 解决方案,它将所提供的嵌套项目列表的 XML 表示形式转换为平面有序项目列表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:apply-templates select="*[1]"/>
</xsl:template>
<xsl:template match="*/*">
<xsl:copy/>
<xsl:apply-templates select="*[1]"/>
<xsl:apply-templates select="following-sibling::*[1]"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于您提供的输入的 XML 表示形式时:
<t>
<A>
<A.1>
<A.1.1/>
<A.1.2/>
</A.1>
<A.2>
<A.2.1/>
</A.2>
<A.3/>
</A>
<B>
<B.1/>
<B.2>
<B.2.1/>
<B.2.2>
<B.2.2.1/>
<B.2.2.2/>
</B.2.2>
</B.2>
</B>
</t>
生成所需的、正确排序的平面序列:
<A/>
<A.1/>
<A.1.1/>
<A.1.2/>
<A.2/>
<A.2.1/>
<A.3/>
<B/>
<B.1/>
<B.2/>
<B.2.1/>
<B.2.2/>
<B.2.2.1/>
<B.2.2.2/>
更新:这是一个非递归甚至更简单的 XSLT 解决方案(感谢 Andrew Welch 提醒我这一点):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="//*">
<xsl:copy/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
在递归解决方案最终导致真正的堆栈溢出的情况下,此解决方案可以正常工作真正的堆栈溢出。
关于LINQ:我们可以从层次结构创建一个平面列表吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7769558/