Microsoft Word - 邮件合并使用 XSL 修改包含 XML 的单个字段

Microsoft Word - 邮件合并使用 XSL 修改包含 XML 的单个字段

我正在尝试插入一个基于数据源 XML 的表格。我希望此 XML 作为单个合并字段输入,该字段将与其他合并字段一起提供。我正在使用的限制是合并文档必须是一行对应一个文档。

下面是可能的 XML 示例;

<?xml version="1.0" encoding="utf-8"?>
<PaymentPlanInstalments>
   <Instalment Number="1" Date="2018-12-04" Amount="10"></Instalment>
   <Instalment Number="2" Date="2018-12-05" Amount="20"></Instalment>
   <Instalment Number="3" Date="2018-12-06" Amount="30"></Instalment>
</PaymentPlanInstalments>

我已设法使用 /INCLUDETEXT 获得概念验证,并使用下面的 xsl 格式样式表将上述 XML 保存在文件中

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <xsl:template match="/">
    <xsl:processing-instruction name="mso-application">
      <xsl:text>progid="Word.Document"</xsl:text>
    </xsl:processing-instruction>
    <w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no">
      <w:body>
        <wx:sect>
          <w:tbl>
            <w:tblPr>
              <w:tblW w:w="0" w:type="auto" />
            </w:tblPr>
            <w:tblGrid>
              <w:gridCol w:w="4000" />
              <w:gridCol w:w="4000" />
              <w:gridCol w:w="4000" />
            </w:tblGrid>
            <w:tr>
              <w:trPr>
                <w:tblHeader />
              </w:trPr>
              <w:tc>
                <w:tcPr>
                  <w:tcW w:w="4000" w:type="dxa" />
                  <w:shd w:val="clear" w:color="auto" w:fill="auto" />
                </w:tcPr>
                <w:p>
                  <w:r>
                    <w:t>Instalment Number</w:t>
                  </w:r>
                </w:p>
              </w:tc>
              <w:tc>
                <w:tcPr>
                  <w:tcW w:w="4000" w:type="dxa" />
                  <w:shd w:val="clear" w:color="auto" w:fill="auto" />
                </w:tcPr>
                <w:p>
                  <w:r>
                    <w:t>Instalment Date</w:t>
                  </w:r>
                </w:p>
              </w:tc>
              <w:tc>
                <w:tcPr>
                  <w:tcW w:w="4000" w:type="dxa" />
                  <w:shd w:val="clear" w:color="auto" w:fill="auto" />
                </w:tcPr>
                <w:p>
                  <w:r>
                    <w:t>Instalment Amount</w:t>
                  </w:r>
                </w:p>
              </w:tc>
            </w:tr>
            <xsl:for-each select="//PaymentPlanInstalments/Instalment">
              <w:tr>
                <w:tc>
                  <w:tcPr>
                    <w:tcW w:w="4000" w:type="dxa" />
                    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
                  </w:tcPr>
                  <w:p>
                    <w:r>
                      <w:t>
                        <xsl:value-of select="@Number" />
                      </w:t>
                    </w:r>
                  </w:p>
                </w:tc>
                <w:tc>
                  <w:tcPr>
                    <w:tcW w:w="4000" w:type="dxa" />
                    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
                  </w:tcPr>
                  <w:p>
                    <w:r>
                      <w:t>
                        <xsl:value-of select="@Date" />
                      </w:t>
                    </w:r>
                  </w:p>
                </w:tc>
                <w:tc>
                  <w:tcPr>
                    <w:tcW w:w="4000" w:type="dxa" />
                    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
                  </w:tcPr>
                  <w:p>
                    <w:r>
                      <w:t>
                        <xsl:value-of select="@Amount" />
                      </w:t>
                    </w:r>
                  </w:p>
                </w:tc>
              </w:tr>
            </xsl:for-each>
          </w:tbl>
          <w:p />
          <w:sectPr>
            <w:pgSz w:w="11906" w:h="16838" />
            <w:pgMar w:top="1417" w:right="1417" w:bottom="1134" w:left="1417" w:header="708" w:footer="708" w:gutter="0" />
            <w:cols w:space="708" />
            <w:docGrid w:line-pitch="360" />
          </w:sectPr>
        </wx:sect>
      </w:body>
    </w:wordDocument>
  </xsl:template>
</xsl:stylesheet>

这将生成下表(抱歉,我是被 Stack Overflow 发到这里来的,我没有 10 个代表来嵌入图像)

https://i.stack.imgur.com/HBhGJ.png

底层包含的文本如下所示:

{INCLUDETEXT sample.xml \c XML \t sample2.xsl}

请注意,sample.xml 和 sample2.xsl 与 word 文档存储在同一个目录中,并包含上述数据和格式规则。

但是我遇到的问题是,一旦我将 XML 添加到合并字段记录,我就无法再应用 XSL 转换。

使用邮件合并功能可以实现这个功能吗?

如果无法将 XSL 格式应用于合并字段,是否有其他解决方案可以将表添加到单个合并字段?

编辑:我提出了部分解决方案,但它对我的业务需求没有用。我做这个补充是为了万一其他人遇到同样的问题,并且这对他们有用。

我添加了一个名为 InstalmentFile 的新合并字段,其中包含将用于构建表的 XML 文件的名称,并在 INCLUDETEXT 中提供,表格底层代码现在读取

{INCLUDETEXT "{MERGEFIELD InstalmentFile}" \c XML \t sample2.xsl}

这将加载外部 xml 文件并应用 xsl 转换。

我已经修改了生成邮件合并数据源的数据库进程,以返回我将生成的 XML 文件的名称,同时将邮件合并数据集中的 XML 转储到与邮件合并模板位于同一位置的文件中。

不幸的是,这不能解决我的问题,因为生成和清理 XML 文件有点太麻烦了。所以如果有人有任何想法,我仍然很高兴听到他们!

相关内容