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. Так что если у кого-то есть идеи, я все равно рад их услышать!