使用XSLT转换XML [英] Transforming XML using an XSLT

查看:127
本文介绍了使用XSLT转换XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Access中有一个表,其中有一个包含我的XSLT代码的字段.我想导入一个XML文档,并使用表中的XSLT对其进行转换.但是,出现以下错误:

I have a table in Access that has a field with my XSLT code in it. I want to import an XML document and transform it with the XSLT from the table. However, I get the following error:

'-2147467259 (800004005)' the stylesheet does not contain a document element. The stylesheet may be empty, or it may not be a well-formed xml document

使用xml验证程序的检查成功.

A check with an xml validator is successful.

Private Sub btnImport_Click()
Dim StrFileName As String
Dim fd As FileDialog
Dim vrtSelectedItem As Variant
Dim strFile As String, strPath As String
Dim xmlDoc As New MSXML2.DOMDocument60, xslDoc As New MSXML2.DOMDocument60
Dim newDoc As New MSXML2.DOMDocument60

Dim daoRST As DAO.Recordset: Set daoRST = CurrentDb.OpenRecordset("Attachments"): Debug.Print daoRST.Fields("XML").Value:

Set xmlDoc = New MSXML2.DOMDocument60
Set newDoc = New MSXML2.DOMDocument60
Set fd = Application.FileDialog(msoFileDialogFilePicker)

    With fd
        .InitialFileName = "C:\Users\1122335\Desktop\*.xml"
        If .Show = -1 Then
            For Each vrtSelectedItem In .SelectedItems
            xslDoc.Load daoRST.Fields("XML").Value
            ' LOAD XML SOURCE
            xmlDoc.Load vrtSelectedItem
            ' TRANSFORM SOURCE
            xmlDoc.transformNodeToObject xslDoc, newDoc '<<ERROR HERE
            newDoc.Save "C:\Users\1122335\Desktop\temp.xml"

            ' APPEND TO TABLES
            On Error Resume Next
            Application.ImportXML "C:\Users\1122335\Desktop\temp.xml", acAppendData

            Next vrtSelectedItem
        Else
        End If
    End With
End Sub

此行出现错误:

xmlDoc.transformNodeToObject xslDoc, newDoc

推荐答案

每当使用记录集调用方式从字符串中加载带有MSXML的DOM对象时,请使用loadXML方法,而不要使用load,后者希望后者被保存文件放在磁盘或URL路径上.

Whenever loading a DOM object with MSXML from string as you are with recordset call, use the loadXML method rather than load which the latter expects a saved file on disk or url path.

所以只需更改:

xslDoc.Load daoRST.Fields("XML").Value

收件人:

xslDoc.LoadXML daoRST.Fields("XML").Value


顺便说一句,您不需要在每次循环迭代时重新加载XSLT,而只需在外部一次加载,但是XML对象应该在循环内部重新初始化,而不是在外部重新初始化.考虑进行以下调整:


By the way, you should not need to re-load XSLT with each iteration of loop but only once outside but the XML objects should be re-initialized inside loop not once outside. Consider following adjustment:

...
' LOAD XSL SCRIPT
xslDoc.LoadXML daoRST.Fields("XML").Value
Set fd = Application.FileDialog(msoFileDialogFilePicker)

With fd
    .InitialFileName = "C:\Users\1122335\Desktop\*.xml"
    If .Show = -1 Then
        For Each vrtSelectedItem In .SelectedItems
            ' INITIALIZE XML OBJECTS
            Set xmlDoc = New MSXML2.DOMDocument60
            Set newDoc = New MSXML2.DOMDocument60

            ' LOAD XML SOURCE
            xmlDoc.Load vrtSelectedItem
            ' TRANSFORM SOURCE
            xmlDoc.transformNodeToObject xslDoc, newDoc
            newDoc.Save "C:\Users\1122335\Desktop\temp.xml"

            ' APPEND TO TABLES
            On Error Resume Next
            Application.ImportXML "C:\Users\1122335\Desktop\temp.xml", acAppendData
        Next vrtSelectedItem                        
    End If
End With

' FREE RESOURCES
Set xmlDoc = Nothing
Set newDoc = Nothing
Set xslDoc = Nothing

这篇关于使用XSLT转换XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆