LINQ:我们可以从层次结构创建一个平面列表

WPF*_*-it 6 linq xslt

好的......标题是正确的......

我不想要从平面列表中的层次结构,但完全相反

我有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元素列表吗?

Dim*_*hev 6

如果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)

在递归解决方案最终导致 实际堆栈溢出的情况下,此解决方案可以正常工作.