Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 使用Transform的Range.InsertXML_Vba_Xslt_Ms Word - Fatal编程技术网

Vba 使用Transform的Range.InsertXML

Vba 使用Transform的Range.InsertXML,vba,xslt,ms-word,Vba,Xslt,Ms Word,我正在使用Range.InsertXML将格式化内容添加到现有的MS Word文档中 InsertXML方法将参数XML作为字符串,将XLST(Transform)作为变量;然而,缺少的是,它没有提供一个包括使用变换的示例 在回答这个问题时:Cindy Meister链接到这篇文章,解释了关于单词XML以及如何使用它的lotd,但我仍然找不到任何使用转换的示例 我想做的与这个问题相同:(但使用VBA) 从这个问题来看,这是我希望能够使用的经过修改的代码: Sub testInsertXML()

我正在使用
Range.InsertXML
将格式化内容添加到现有的MS Word文档中

InsertXML方法将参数XML作为字符串,将XLST(Transform)作为变量;然而,缺少的是,它没有提供一个包括使用变换的示例

在回答这个问题时:Cindy Meister链接到这篇文章,解释了关于单词XML以及如何使用它的lotd,但我仍然找不到任何使用转换的示例

我想做的与这个问题相同:(但使用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
Sub testInsertXML()
将strXML设置为字符串
将XSLT作为变量
strXML=“crash2005thedeparted2006thepurplementsofhappiness2006thebucket list 2007”
XSLT=“=$i”“>$i]”>”和_
""
Selection.Range.InsertXML strXML,XSLT
端接头
我已经在字符串中添加了双引号(以便在使用debug.print时正确显示引号),并添加了其他标记,如前所述

我想我没有正确设置转换。如果将变换设置为vbnullstring,则所有操作都有效。否则我会得到一个错误:

无法在指定位置插入XML标记

基本上,作为对这个问题的回答,我想要一个简单的示例,演示如何使用Transform使用
.InsertXML

工作解决方案: xml的原始源似乎来自此站点。顺便提一下,还有一些关于如何直接从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

我感觉转换结果可能不是有效的Word Open XML。如果创建的XML字符串完全使用xslt中指定的结构(尤其是名称空间),那么可以使用InsertXML插入该结构,还是会导致相同的错误?参考您链接的文章,仔细看看简化的Office Open Markup”:您缺少外部结构,例如,等等。Word*需要这些结构来插入Open XML。Hi@Cindymister-是的,如果我排除转换,只使用(erm)定稿后的XML就可以工作了。你缺少了一点……啊-谢谢-我会仔细看一看:)非常感谢