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

标签 linq xslt

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

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

我有一个文件夹类,其中包含由属性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/

相关文章:

c# - DateTime 与 LINQ 中格式的比较

C# Linq 如何比较两个字符串并报告第一个不同于 '?' 通配符的不同字符

c# - 如何过滤嵌套关系

xml - 使用 xpath 选择具有一组多个属性/值的元素

c# - xslt V1.0 - 具有递归循环的子模板返回空值

xslt - XSL。只返回第一个非空元素

.net - VB.NET 排序 IEnumerable 类

linq - 如何在 Linq 中合并集合的集合

java - 如何使用 XSLT 过滤 XML 节点内的元素进行转换?

xslt - 在XSL节点选择中基于属性通配符排除节点