好的......标题是正确的......
我不想要从平面列表中的层次结构,但完全相反
我有Folder类,其中包含属性所包含的文件夹列表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
Run Code Online (Sandbox Code Playgroud)
从这个层次结构中,我期待的平面列表正好是它出现在上面的顺序!
如果LINQ不能这样做,那么XSLT可以将它变成一个xml元素列表吗?
如果LINQ不能这样做,那么XSLT可以将它变成一个xml元素列表吗?
有几个人已经展示了如何使用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>
Run Code Online (Sandbox Code Playgroud)
当此转换应用于您提供的输入的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>
Run Code Online (Sandbox Code Playgroud)
生成所需的,正确排序的平面序列:
<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/>
Run Code Online (Sandbox Code Playgroud)
更新:这是一个非递归甚至更简单的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>
Run Code Online (Sandbox Code Playgroud)
在递归解决方案最终导致 实际堆栈溢出的情况下,此解决方案可以正常工作.
| 归档时间: |
|
| 查看次数: |
1519 次 |
| 最近记录: |