我正在使用Range.InsertXML
将格式化内容添加到现有的MS Word文档中。
AFAICT,方法.InsertXML将参数XML作为字符串,XLST(Transform)作为变量;但是the documentation for .InsertXML缺乏,因为它没有提供包含使用Transform的示例。
在回答这个问题时:Range.InsertXML throws when inserting Open XML Cindy Meister链接到an excellent resource,解释了有关Words XML及其使用方法的批次,但我仍然无法找到使用Transform的任何示例
我要做的是与此问题相同:XSLT create table with dynamic number of rows and columns(但使用VBA)。
从这个问题来看,这是我期望工作的修改后的代码:
Sub testInsertXML()
Dim strXML As String
Dim XSLT As Variant
strXML = "<Movies><Genre name=""Action""><Movie><Name>Crash</Name><Released>2005</Released></Movie></Genre><Genre name=""Drama""><Movie><Name>The Departed</Name><Released>2006</Released></Movie><Movie><Name>The Pursuit of Happyness</Name><Released>2006</Released></Movie></Genre><Genre name=""Comedy""><Movie><Name>The Bucket List</Name><Released>2007</Released></Movie></Genre></Movies>"
XSLT = "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:w=""http://schemas.microsoft.com/office/word/2003/wordml""><xsl:output indent=""yes""/><xsl:template match=""/""><w:document><w:body><w:tbl><w:tr><xsl:for-each select=""/Movies/Genre""><w:tc><w:p><w:r><w:t><xsl:value-of select=""@name""/></w:t></w:r></w:p></w:tc></xsl:for-each></w:tr><!-- Movies? --><xsl:call-template name=""movies-row""><xsl:with-param name=""i"" select=""1""></xsl:with-param></xsl:call-template></w:tbl></w:body></w:document></xsl:template><xsl:template name=""movies-row""><xsl:param name=""i""/><w:tr><xsl:for-each select=""/Movies/Genre""><w:tc><w:p><w:r><w:t><xsl:choose><xsl:when test=""count(Movie) >= $i""><xsl:value-of select=""concat(Movie[$i]/Name, ' (', Movie[$i]/Released, ')')""/></xsl:when><xsl:otherwise><!-- empty cell --></xsl:otherwise></xsl:choose></w:t></w:r></w:p></w:tc></xsl:for-each></w:tr><xsl:if test=""/Movies/Genre[count(Movie) > $i]"">" & _
"<xsl:call-template name=""movies-row""><xsl:with-param name=""i"" select=""$i + 1""/></xsl:call-template></xsl:if></xsl:template></xsl:stylesheet>"
Selection.Range.InsertXML strXML, XSLT
End Sub
我在字符串中添加了双引号(以便在使用debug.print时正确显示引号)并且我已按照here所述添加了其他标记。
我想我没有正确设置转换。如果将Transform设置为vbnullstring,则一切正常。否则我收到错误:
无法在指定位置插入XML标记
基本上,作为这个问题的答案,我想要一个最小的例子来说明如何使用变换来使用.InsertXML
。
答案 0 :(得分:1)
xml的原始来源似乎来自此docs.microsoft.com网站。顺便提一下,还有一些关于如何直接从MS Word文档创建XSLT的说明(尽管是手动的)。
无论如何,最简单的方法是转换并插入两个单独的步骤,如下所示:
Sub xmlTest()
Dim xData As MSXML2.DOMDocument60
Dim xTnsf As MSXML2.DOMDocument60
Dim xOutp As MSXML2.DOMDocument60
Set xData = New MSXML2.DOMDocument60
Set xTnsf = New MSXML2.DOMDocument60
Set xOutp = New MSXML2.DOMDocument60
xData.Load "C:\Temp\MyMovies.xml"
xTnsf.Load "C:\Temp\MyMovies.xslt"
xData.transformNodeToObject xTnsf, xOutp
ThisDocument.Range.InsertXML xOutp.XML
Debug.Print xOutp.XML
End Sub