gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:41:50 25 4
gpt4 key购买 nike

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com