Microsoft Word - Mail Merge изменяет одно поле, содержащее XML, с помощью XSL

Я пытаюсь вставить таблицу на основе 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 с приведенным выше XML-файлом, сохраненным в файле с использованием приведенной ниже таблицы стилей форматирования xsl.

<?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>

Это приводит к следующей таблице (извинения, которые я послал сюда из-за переполнения стека и не имею 10 повторений для встраивания изображений)

Основной текст включения выглядит так:

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

Обратите внимание, что sample.xml и sample2.xsl хранятся в том же каталоге, что и документ word, и содержат приведенные выше данные и правила форматирования.

Однако проблема, с которой я сталкиваюсь, заключается в том, что после добавления XML в запись поля слияния я больше не могу применять XSL-преобразование.

Возможно ли это с помощью функциональности Mailmerge?

Если невозможно применить форматирование XSL к полю слияния, есть ли у них какие-либо другие решения, чтобы добавить таблицу в одно поле слияния?

РЕДАКТИРОВАТЬ: Я предложил частичное решение, но оно не полезно для моих бизнес-требований. Я делаю это дополнение, если кто-то еще сталкивается с той же проблемой, и это работает для них.

Я добавил новое поле слияния с именем InstalmentFile, которое содержит имя XML-файла, который будет использоваться для построения таблицы, и при условии, что в INCLUDETEXT таблицы, лежащие в основе кода, теперь читают

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

Это загрузит внешний файл XML и применит преобразования xsl.

Я изменил процесс базы данных, который генерирует источник данных слияния, чтобы он возвращал имя XML-файла, который я буду генерировать, и в то же время выгружал XML-файл, который был бы в наборе данных слияния, в файл в том же месте, что и шаблон слияния.

К сожалению, это не решит мою проблему, так как это слишком грязно, чтобы генерировать и затем очищать файлы XML. Так что если у кого-то есть идеи, я все равно рад их услышать!

0 ответов

Другие вопросы по тегам