XSL FO Передача динамического значения из HTML в переменную XSLT - PullRequest
4 голосов
/ 19 мая 2019

Я пытаюсь создать PDF из HTML-файла, используя FOP.Мое требование, я хочу передать значение переменной во время выполнения.Как я могу передать значение переменной во время выполнения?

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Не ясно, в какой момент вы можете вводить «переменные», и как вы ожидаете их делать.Вот пример, который может послужить источником вдохновения.Он использует только простой перевод идентификаторов и пропускает все объекты FO для краткости.

Общий принцип - вставьте скрытый div с некоторыми кодами, которые являются переменными.Например, ваш входной HTML-код теперь имеет следующее:

<html>
    <div class="variables" style="display:none">
        <div class="var_1" data-value="variable 1 value"/>
        <div class="var_2" data-value="variable 2 value"/>
        <div class="var_3" data-value="variable 3 value"/>
    </div>
    <div>
        <div>Var 1 Value: <span class="variable" data-ref="var_1"/></div>
        <div>Var 2 Value: <span class="variable" data-ref="var_2"/></div>
        <div>Var 3 Value: <span class="variable" data-ref="var_3"/></div>
    </div>
</html>

И вы изменяете свой XSL для шаблона, который соответствует span, в который вы хотите вставить переменную:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="span[@class='variable']">
        <xsl:variable name="lookup">
            <xsl:value-of select="@data-ref"/>
        </xsl:variable>
        <span>
            <xsl:value-of select="//div[@class=$lookup]/@data-value"/>
        </span>
    </xsl:template>
    <xsl:template match="node()">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Вывод этого будет:

<html>
<div class="variables" style="display:none">
  <div class="var_1" data-value="variable 1 value"></div>
  <div class="var_2" data-value="variable 2 value"></div>
  <div class="var_3" data-value="variable 3 value"></div>
</div>
<div>
  <div>Var 1 Value: <span>variable 1 value</span></div>
  <div>Var 2 Value: <span>variable 2 value</span></div>
  <div>Var 3 Value: <span>variable 3 value</span></div>
</div>
</html

Конечно, вы можете расширить его, добавив шаблон для удаления div, чей класс variables, например, чтобы его не было ввыводится или обрабатывается вашими шаблонами.

0 голосов
/ 19 мая 2019

Вы можете передать параметры в таблицу стилей XSLT, которая генерирует XSL-FO, то есть формат FOP.

Если вы используете FOP для преобразования XSLT, формат будет -param name value (см. https://xmlgraphics.apache.org/fop/2.3/running.html). Если вы используете внешний процессор XSLT для генерации XSL-FO, который вы передаете в FOP, то вы используйте формат, требуемый процессором XSLT (который будет указан в документации).

Наиболее близкими к изменяемому тексту на этапе форматирования являются fo:marker и fo:table-marker, но даже маркеры устанавливаются до начала форматирования, и изменчивость возникает из-за незнания места разрыва страницы до форматирования документа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...