【发布时间】:2020-01-19 12:28:24
【问题描述】:
由于上一个问题,我得到了以下代码。
代码的意思是遍历一个 excelsheet 并自动用单元格内容填充 XML 标记。输出是此 excelsheet 中每一行的 XML 文件。
现在我有一个非常相似的案例,而且我知道,要完成它不会有太多改变。我希望我的代码不是为每一行创建一个新的 XML 文件,而是在同一个 XML 文件中填充所有内容。
我要自动填写这个excel-table的内容:
进入一个最初看起来像这样的 XML 模板:
<?xml version="1.0" encoding="UTF-8"?>
<Codes>
<AreaCodes>
<Area>
<Name></Name>
<Desc/>
<Facility_Area></Facility_Area>
</Area>
</AreaCodes>
</Codes>
FACILITY 列必须在 Facility_Area-Tag 中移动。
必须在名称标签中移动 AREA 列。
Area 内的所有嵌套标签都应该重复。
对于我的 Excel 示例,输出应如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Codes>
<AreaCodes>
<Area>
<Name>RA 001</Name>
<Desc/>
<Facility_Area>ZUF</Facility_Area>
</Area>
<Area>
<Name>RA 002</Name>
<Desc/>
<Facility_Area>ZUF</Facility_Area>
</Area>
<Area>
<Name>RA 003</Name>
<Desc/>
<Facility_Area>ZUF</Facility_Area>
</Area>
<Area>
<Name>RA 004</Name>
<Desc/>
<Facility_Area>ZUF</Facility_Area>
</Area>
...
</AreaCodes>
</Codes>
一个文件。
这是我有 atm 的 XSLT 模板:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:param name="facility" />
<xsl:param name="area" />
<!-- IDENTITY TRANSFORM -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Templates -->
<xsl:template match="Codes/AreaCodes/Area/Name">
<xsl:copy>
<xsl:value-of select="$area"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Codes/AreaCodes/Area/Facility_Area">
<xsl:copy>
<xsl:value-of select="$facility"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
最后但并非最不重要的 VBA 代码将所有内容组合在一起:
Sub Param_XSLT_Process()
...
' LOAD XML AND XSL FILES
xmldoc.async = False
xmldoc.Load "Path\To\Vorlage_AREA.xml"
xslDoc.async = False
xslDoc.setProperty "AllowDocumentFunction", True
xslDoc.Load "Path\To\XSL_SHEET.xsl"
' INITIALIZE NEEDED OBJECTS
Set xslTemp.stylesheet = xslDoc
Set xslProc = xslTemp.createProcessor()
xslProc.input = xmldoc
' ITERATE THROUGH EACH ROW, TRANSFORM, SAVE XML OUTPUT
With ActiveWorkbook.Worksheets(1)
lLastRow = .UsedRange.Rows.Count
For lRow = 2 To lLastRow
xslProc.addParameter "area", CStr(.Cells(lRow, 2).Value) ' ADD PARAMETER(S)
xslProc.addParameter "facility", CStr(.Cells(lRow, 1).Value)
xslProc.transform ' TRANSFORM XML
newDoc.LoadXML xslProc.output ' LOAD RESULT TREE
newDoc.Save "Path\To\Output_" & lRow - 1 & ".xml" ' SAVE OUTPUT TO FILE
Next lRow
End With
...
End Sub
现在,所有内容都放在一个单独的 XML 文件中。
谁能告诉我,我必须改变什么?我知道,对于我的 VBA 代码,我应该将那些保存命令移到循环之外,但这不起作用。
很抱歉让您的英语陷入困境,感谢大家的帮助。
【问题讨论】: