树型结构的数据,在数据库中是以二维方式(表格形式)保存的,如何转换成树型结构的XML呢?

时间:2021-11-06 11:41:29
对树型结构数据,如某组织结构,如要用数据库表示,一般要把层次信息变成依附于记录中的字段,形成常见的表格形式。而树型结构数据用XML来表达最方便,那么如何做它们之间的转换呢?是不是用个XSL来转换?
我不大懂XSL,查了半天资料不得其解,希望高手指点,谢谢。

8 个解决方案

#1


以下示例,修改一下,递归调用,很容易重现你的树型结构的
--xml
<?xml version="1.0" encoding="GB2312"?>
<Root>
    <Node>
        <Name>a</Name>
        <Code>01</Code>
    </Node>
    <Node>
        <Name>b</Name>
        <Code>0101</Code>
    </Node>
    <Node>
        <Name>c</Name>
        <Code>02</Code>
    </Node>
<Root>

--xsl
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" method="html" encoding="GB2312"/>
<xsl:template match="/">
<xsl:for-each select="Root/Node[string-length(Code)=2]">
<xsl:sort select="Code"/>
<xsl:variable name="prefix" select="Code"/>
<xsl:for-each select="/Root/Node[substring(Code,1,2)=$prefix and string-length(Code) = 4]">
<xsl:sort select="Code"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

#2


你也可以把转换逻辑封装到你的代码中
但是使用XSLT生成一个新的结构的XML,也不失为一种好方法。

#3


在存储上来说,数据表里加几个辅助字段,用递归的方法查出数据用dom生成xml文件.比较常见的方法是加一个字段,表明父节点的ID;也可以采用用线性编码的方法,前者可以无层次深度限制,后者效率教高
-------------------------------------------------------------------
在显示上来说,用xslt是一种思路,但也可以把xml单纯地当作传输的载体,在客户端用DHTML实现

#4


http://www.csdn.net/Develop/read_article.asp?id=13753

#5


谢谢大家!

to 王文友:
还有问题,再次请教
1 好像这代码只能使用在两级结构这种情况下,如果有更多级,是不是就要你说的递归方法,怎么实现?能否再给个代码示例一下?
2 这代码是应用在数据库使用线形编码表示节点位置这种情况下的,如果是在节点(记录)中只存父节点ID,是否还可以用XSLT方法转换?
非常感谢。

to 阳光灿烂的深夜
我在考虑两种表达法都应该有转换思路,如果是仅用父ID表示节点位置,是不是只能用DOM,把每条记录插入到XML树中适当的位置,还是可以先简单的建立两层结构的XML文件,用attr或者element表示父节点ID,再用XSLT转换成多层次的树状XML?如果是用线性编码表示节点位置,思路就象王文友所给出示例,只是递归怎么实现?

to 孟子E章
谢谢,很好的一篇文章。我现在在.NET环境下编程,数据库到XML转换比较容易,不过你给出的XSL转换方法还是停有用。现在我的问题其实是在XML编码条件下用二维方式表达的树状数据结构怎么和多层次树转换的问题,能否再给些指点?谢谢!

#6


大致实现思路如下
<xsl:template name="loop">
<xsl:param name="prefix"/>
<xsl:param name="len"/>
<!-- Do Something -->
<xsl:for-each select="//Node[substring(Code,1,$len)=$prefix and string-length(Code) = $len]">
<xsl:variable name="newPrefix" select="Code"/>
<xsl:call-template name="loop">
<xsl:with-param name="prefix">
<xsl:value-of select="$newPrefix"/>
</xsl:with-param>
<xsl:with-param name="len" select="$len + 2"/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>

#7


其实这里还有个问题,你想让你的树怎么显示呢?是先直接成全部节点,还是要等客户端先点击某个节点,再向服务器请求下层节点?

#8


to 深夜:怎么显示树倒是其次,我主要是对数据转换感兴趣。
TO 王文友 ,非常感谢你的帮助。我还是不大懂,呵呵,XSLT的转换没学会 :) .这几天公司的活忙,又遇上世界杯,唉,有时间再用你的代码试试。
如果你有完整的例子,麻烦发到我的信箱 simon_hong@163.com
我就先结贴了。谢谢大家

#1


以下示例,修改一下,递归调用,很容易重现你的树型结构的
--xml
<?xml version="1.0" encoding="GB2312"?>
<Root>
    <Node>
        <Name>a</Name>
        <Code>01</Code>
    </Node>
    <Node>
        <Name>b</Name>
        <Code>0101</Code>
    </Node>
    <Node>
        <Name>c</Name>
        <Code>02</Code>
    </Node>
<Root>

--xsl
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" method="html" encoding="GB2312"/>
<xsl:template match="/">
<xsl:for-each select="Root/Node[string-length(Code)=2]">
<xsl:sort select="Code"/>
<xsl:variable name="prefix" select="Code"/>
<xsl:for-each select="/Root/Node[substring(Code,1,2)=$prefix and string-length(Code) = 4]">
<xsl:sort select="Code"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

#2


你也可以把转换逻辑封装到你的代码中
但是使用XSLT生成一个新的结构的XML,也不失为一种好方法。

#3


在存储上来说,数据表里加几个辅助字段,用递归的方法查出数据用dom生成xml文件.比较常见的方法是加一个字段,表明父节点的ID;也可以采用用线性编码的方法,前者可以无层次深度限制,后者效率教高
-------------------------------------------------------------------
在显示上来说,用xslt是一种思路,但也可以把xml单纯地当作传输的载体,在客户端用DHTML实现

#4


http://www.csdn.net/Develop/read_article.asp?id=13753

#5


谢谢大家!

to 王文友:
还有问题,再次请教
1 好像这代码只能使用在两级结构这种情况下,如果有更多级,是不是就要你说的递归方法,怎么实现?能否再给个代码示例一下?
2 这代码是应用在数据库使用线形编码表示节点位置这种情况下的,如果是在节点(记录)中只存父节点ID,是否还可以用XSLT方法转换?
非常感谢。

to 阳光灿烂的深夜
我在考虑两种表达法都应该有转换思路,如果是仅用父ID表示节点位置,是不是只能用DOM,把每条记录插入到XML树中适当的位置,还是可以先简单的建立两层结构的XML文件,用attr或者element表示父节点ID,再用XSLT转换成多层次的树状XML?如果是用线性编码表示节点位置,思路就象王文友所给出示例,只是递归怎么实现?

to 孟子E章
谢谢,很好的一篇文章。我现在在.NET环境下编程,数据库到XML转换比较容易,不过你给出的XSL转换方法还是停有用。现在我的问题其实是在XML编码条件下用二维方式表达的树状数据结构怎么和多层次树转换的问题,能否再给些指点?谢谢!

#6


大致实现思路如下
<xsl:template name="loop">
<xsl:param name="prefix"/>
<xsl:param name="len"/>
<!-- Do Something -->
<xsl:for-each select="//Node[substring(Code,1,$len)=$prefix and string-length(Code) = $len]">
<xsl:variable name="newPrefix" select="Code"/>
<xsl:call-template name="loop">
<xsl:with-param name="prefix">
<xsl:value-of select="$newPrefix"/>
</xsl:with-param>
<xsl:with-param name="len" select="$len + 2"/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>

#7


其实这里还有个问题,你想让你的树怎么显示呢?是先直接成全部节点,还是要等客户端先点击某个节点,再向服务器请求下层节点?

#8


to 深夜:怎么显示树倒是其次,我主要是对数据转换感兴趣。
TO 王文友 ,非常感谢你的帮助。我还是不大懂,呵呵,XSLT的转换没学会 :) .这几天公司的活忙,又遇上世界杯,唉,有时间再用你的代码试试。
如果你有完整的例子,麻烦发到我的信箱 simon_hong@163.com
我就先结贴了。谢谢大家