VB6 操作XML,如何获取排序后的NodeList,100分送上,2008-2-21 19:00前完美解答,得 "双倍" 奖励!!!!!!!!!!!!!!!!!

OICQshenshi 2008-02-21 01:37:21
test.xml
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="test.xslt"?>
<年级>
<班级 名称="1小班">
<学生 姓名='a'/>
<学生 姓名='aaa'/>
<学生 姓名='aa'/>
</班级>
<班级 名称="3大班">
<学生 姓名='bb'/>
<学生 姓名='ba'/>
</班级>
<班级 名称="2中班">
<学生 姓名='ccc'/>
</班级>
</年级>

test.xsl 文件排序后IE浏览器中显示的是空白或者是显示不出标记(如<班级><名称><学生>这些元数据),我想得到最终newtest.xml的显示效果

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="GB2312" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="//班级">
<xsl:sort order="ascending" select="@名称"/>

</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

问题一:
请教test.xsl如何写才能得到如下顺序

newtest.xml
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="test.xslt"?>
<年级>
<班级 名称="1小班">
<学生 姓名='a'/>
<学生 姓名='aaa'/>
<学生 姓名='aa'/>
</班级>
<班级 名称="2中班">
<学生 姓名='ccc'/>
</班级>
<班级 名称="3大班">
<学生 姓名='bb'/>
<学生 姓名='ba'/>
</班级>
</年级>

问题一最终目的还是解决问题二:
请教VB6 中如何使用xmldom.transformnode,

net_lover大侠曾给过如下代码

set xsldom = createxmlobject("msxml2.domdocument")
xsldom.load "d:\sortxmlbygetlastmodified.xsl"
xmldom.transformnode xsldom,newxmldom

newxmldom就是排序过的



xmldom如下,请教newxmldom,xsldom如何声明呢?
Dim xmldom As DOMDocument
Set xmldom = New DOMDocument
xmldom.async = False
xmldom.load("test.xml")

试过xsldom这样写,但是transformnode的第二个参数newxmldom总报类型错误,困扰2个多月了,求大大们解阿,一定结分!!!!!!!!!!!!!!!!!
Dim xsldom As DOMDocument
Dim newxmldom As DOMDocument
Set xsldom = New DOMDocument
xsldom.async = False
xsldom.load("test.xsl")
xmldom.transformnode xsldom,newxmldom
...全文
215 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
OICQshenshi 2008-03-03
网吧上网的回复不及时,请见谅,问题暂时解决,结帖,如果有VB DOM 通过 xsl:sort 实现方法请留言给我 或者 E-mail:Genthelvite@Gmail.com 收到解决方法后定300分重奖。
回复
vbman2003 2008-02-25
xsl的不会,这个最好到相关板块去问下
给你一个用VB解决的思路参考一下吧:



'排序代码(这个是投机取巧的方法,要引用“Microsoft AetiveX Date Objects 2.x Library”)
'参数s是个数组
'返回一个排好序的数组
Private Function GetSort(s() As String) As String()

Dim tmp As String
Dim rst As Recordset

Set rst = New Recordset
With rst
.fields.Append "Fld", adVarChar, 10
.open
For i = LBound(s) To UBound(s)
.AddNew
!Fld = s(i)
.Update
Next
.Sort = "Fld"
tmp = .GetString
.Close
End With
Set rst = Nothing
GetSort = Split(tmp, Chr(13))
End Function

'
Private Sub Command1_Click()

Dim oXmlDoc As DOMDocument
Dim oXmlNode As IXMLDOMNode
Dim oXmlNodes As IXMLDOMNodeList
Dim FileName As String
Dim sFile As String
Dim sSortValue() As String
Dim tmp() As String
Dim i As Long, h As Long

FileName = App.Path & "\tt.xml"

'读出要排序的内容到数组sSortValue
ReDim sSortValue(i)
Set oXmlDoc = New DOMDocument
oXmlDoc.Load (FileName)
Set oXmlNodes = oXmlDoc.documentElement.selectNodes(".//班级")
For Each oXmlNode In oXmlNodes
ReDim Preserve sSortValue(i)
sSortValue(i) = oXmlNode.Attributes(0).Text
i = i + 1
Next
Set oXmlNode = Nothing
Set oXmlNodes = Nothing
Set oXmlDoc = Nothing
'排序
sSortValue = GetSort(sSortValue)

'将xml整体读出到变量sFile
h = FreeFile
Open FileName For Binary As h
sFile = Space(LOF(h))
Get h, , sFile
Close h
'对整体内容分组处理
sFile = Replace(sFile, Chr(0), "")
tmp = Split(sFile, "/班级")

'分组后的内容分别与排序内容对比,重新串接字串
sFile = ""
i = 0
While i < UBound(sSortValue)
sFile = sFile & Filter(tmp, sSortValue(i), True)(0) & "/班级"
i = i + 1
Wend
sFile = sFile & tmp(UBound(tmp))

'写回xml
h = FreeFile
Open App.Path & "\sort_tt.xml" For Output As h
Print #h, sFile
Close

End Sub

回复
vbman2003 2008-02-22
对我来说,xml也是才入门,而且通常xml并不是用来作最终显示的,所以xsl几乎没用过,这个帮不上你
我所说的自己写排序,也就是将xml当作一般文本进行读写:读出要排序的内容-->排序-->写回,就这样了。因为xml没有固有的式样,所以感觉通用的方法不会有,只能针对具体的xml来写。
还有,不知道你为什么要对xml进行排序?我通常都是解析xml中须要的内容出来,如果需要,就对这些内容进行排序,这样不是更好吗?至少省去了重写xml这一步。即使你用xsl可能效率也并不一定高。
回复
OICQshenshi 2008-02-22
解析xml中须要的内容出来,如果需要,就对这些内容进行排序。在我现在环境中 相较 没有用sort效率高及简单,而且有局限性,再次请教今晚7:00前解决仍然双倍奖励
回复
OICQshenshi 2008-02-21
恩,现在用xsl:sort怎么写
回复
vbman2003 2008-02-21
xml没有现成的节点排序方法吧?
可以自己写一个排序方法吧?
不过今天小年,提前下班了......
回复
相关推荐
发帖
VB基础类
创建于2007-09-28

7490

社区成员

VB 基础类
申请成为版主
帖子事件
创建了帖子
2008-02-21 01:37
社区公告
暂无公告