使用XSLT转换XML [英] Transforming XML using an XSLT
问题描述
我在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屋!