XML to XML XSLT transformation. MSXML in VBScript



>我有一个相当嵌套的XML文件,我想用XSL模板将其转换为更简单的东西,以使将数据批量加载到SQL中更有效率。我想在C++(带有 gcc 的代码块(中做到这一点,但是我遇到了一些麻烦,只是能够使用我遇到的任何库(包括 MSXML(加载文档。如果有人有任何使用 gcc 代码块中的 MSXML 的经验,请告诉我!

我有一个样式表,可以使用DOMDocument转换Excel VBA中的XML,但我不想依赖Excel。我认为下一个最好的东西是VBScript。

数据是一个或两个文本值,保存在<DATAVALUE>节点中,是 100 个<LOCATION>节点的后代。每个<LOCATION>节点的第一个子节点称为<LOCATIONNAME>,为每个<LOCATION>节点保留一个唯一的名称(即;NAME1-NAME100(。<LOCATION>节点的第三个和第四个子节点(如果有第四个子节点(是<DATA>节点,每个节点包含一个<DATAVALUE>节点。该文件可以有 100 万个以上的<SAMPLE>节点。下面是 XML:

<?xml version="1.0" encoding="utf-8"?>
<MYImportFile xmlns="urn:ohLookHEREaNamespacedeclaration">
<HEADERVERSION>1.10</HEADERVERSION>
<MESSAGE>Import</MESSAGE>
<MYBED>QUEEN</MYBED>
<SOURCE>SPRING </SOURCE>
<USERID>MMOUSE</USERID>
<DATETIME>2019-11-25T12:31:00</DATETIME>
<SAMPLE TYPE="No" APPLE="false">
<SAMPLEID>0000565</SAMPLEID>
<SAMPLECATEGORY>CLASS5</SAMPLECATEGORY>
<LOCATION APPLE="false">
<LOCATIONNAME>NAME1</LOCATIONNAME>
<READBY>MMOUSE</READBY>
<TIME>12:31:00</TIME>
<DATA>
<DATAVALUE>aaaa</DATAVALUE>
</DATA>
<DATA>
<DATAVALUE>bbbb</DATAVALUE>
</DATA>
</LOCATION>
'''''''''''''''''there are 100 LOCATION entries''''''''''''''''''''''''
<LOCATION APPLE="false">
<LOCATIONNAME>NAME100</LOCATIONNAME>
<READBY>MMOUSE</READBY>
<TIME>12:31:00</TIME>
<DATA>
<DATAVALUE>zzzz</DATAVALUE>
</DATA>
</LOCATION>
</SAMPLE>
'''''''''''''''''repeat for however many SAMPLES there are''''''''''''''''''''''
</MYImportFile>

我想指出一些事情,以便更清楚发生了什么。在转换后的 xml 文档中,我需要考虑的一件事是当<LOCATION>中只有一个<DATA>节点时。这是通过将第一个<DATAVALUE>节点复制到新文档中的第二个<DATAVALUE>节点来完成的。例如,在转换后的工作表中出现两次的<DATAVALUE>"zzzz"在初始 XML 中仅出现一次。以下是我希望转换后的 XML 的外观:

<?xml version="1.0" encoding="UTF-8"?>
<MYImportFile>
<SAMPLE>
<SAMPLEID>0000565</SAMPLEID>
<NAME1_1>aaaa</NAME1_1>
<NAME1_2>bbbb</NAME1_2>
<NAME2_1>cccc</NAME2_1>
<NAME2_2>dddd</NAME2_2>
'''''''''''''''''there are 100 LOCATION entries transformed to NAME1-NAME100''''''''''''''''''''''''
<NAME100_1>zzzz</NAME100_1>
<NAME100_2>zzzz</NAME100_2>
</SAMPLE>
'''''''''''''''''repeat for however many SAMPLES there are''''''''''''''''''''''
</MYImportFile>

我的样式表(适用于VBA代码(:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:b="urn:ohLookHEREaNamespacedeclaration" exclude-result-prefixes="b">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/b:MYImportFile">
<MYImportFile>
<xsl:for-each select="b:SAMPLE">
<SAMPLE>
<SAMPLEID>
<xsl:value-of select="b:SAMPLEID"/>
</SAMPLEID>
<NAME1_1>
<xsl:value-of select="b:LOCATION/b:LOCATIONNAME[text() = 'NAME1']/../b:DATA[1]/b:DATAVALUE"/>
</NAME1_1>
<xsl:choose> 
<xsl:when test="b:LOCATION/b:LOCATIONNAME[text() = 'NAME1']/../b:DATA[2]/b:DATAVALUE">
<NAME1_2>
<xsl:value-of select="b:LOCATION/b:LOCATIONNAME[text() = 'NAME1']/../b:DATA[2]/b:DATAVALUE"/>
</NAME1_2>
</xsl:when>
<xsl:otherwise>
<NAME1_2>
<xsl:value-of select="b:LOCATION/b:LOCATIONNAME[text() = 'NAME1']/../b:DATA[1]/b:DATAVALUE"/>
</NAME1_2>
</xsl:otherwise>
</xsl:choose>

'''''''''''''''''''there are 100 NAME entires to recieve the 100 locations
</SAMPLE>
</xsl:for-each>
</MYImportFile>
</xsl:template>
</xsl:stylesheet>

我的脚本:

Option Explicit
Const strInputFile = "C:PathfileName.xml"
Const strTemplateFile = "C:PathconvFileName.xsl"
Const strOutputFile = "C:PathnewFileName.xml"
Dim objXMLDoc : Set objXMLDoc = WScript.CreateObject("Msxml2.DOMDocument")
objXMLDoc.async = False
objXMLDoc.loadXML(strInputFile)
objXMLDoc.SetProperty "SelectionNamespaces", "xmlns='urn:myNamespace'"
Dim objXSLDoc : Set objXSLDoc = WScript.CreateObject("Msxml2.DOMDocument")
objXSLDoc.async = False
objXSLDoc.loadXML(strTemplateFile)

Dim objNewXMLDoc : Set objNewXMLDoc = WScript.CreateObject("Msxml2.DOMDocument")
objXMLDoc.transformNodeToObject objXSLDoc, objNewXMLDoc 
objNewXMLDoc.save strOutputFile

错误:

行: 19

字符:1

错误:样式表不包含文档元素。这 样式表可能为空,也可能不是格式正确的 XML 文档。

代码:80004005

来源: msxml3.dll

我猜要么我的脚本不太正确,要么我缺少一个设置,导致对象和库不匹配,因为我的 VBA 宏使用该样式表转换 xml。 有人有什么想法吗?让这个东西运行的建议?

据我所知,loadXML采用带有XML的字符串。如果您有要分析的文件或 URL,请使用load方法。

最新更新