2017-02-17 230 views
0

我在Access中有一个表中有一个字段,里面有我的XSLT代码。我想导入一个XML文档并使用表中的XSLT进行转换。不过,我得到以下错误:使用XSLT转换XML

'-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验证支票是成功的。

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 
+0

您是否可以在将其用于转换之前输出'xslDoc'的内容并将其添加到您的问题中?此外,请参阅https://stackoverflow.com/questions/23629754/script16389-the-stylesheet-does-not-contain-a-document-element-the-stylesheet以及类似的谷歌匹配您的错误消息。 – Leviathan

回答

2

每当有MSXML从字符串加载DOM对象,你是有记录的呼叫,使用loadXML方法,而不是load后者预计保存磁盘或网址路径中的文件。

所以,简单地改变:

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

要:

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

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

... 
' 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 
+1

谢谢@Parfait!这解决了它!我一直在寻找2天的答案!也感谢您的调整! – 1122335