XML - статьи



              

Создание XSLT из формул - часть 2


Рис.1. Две роли XSLT: создание и вызов функций

Пример: упрощенное использование вычислительного XSLT 2.0

Упрощение заключается в том, что пропущенные (несуществующие) данные рассматриваются как данные, значение которых равно нулю. Файл schema.xml (листинг 1) имеет три исходных элемента и четыре вычисленных. После преобразования в файл functions.xslt (листинг 2) вычисленный элемент становится элементом <xsl:function> с тем же именем. В файле

functions.xslt префикс пространства имен formula используется для этих функций, автоматически генерируемых из формул, для того, чтобы отличать их от фиксированных вспомогательных функций (пространство имен helper), которые они вызывают (см. ниже). Предполагается, что исходные данные в файле instance.xml (листинг 3) - это данные для одной компании.

Структура формульной функции в файле functions.xslt проста: она имеет один параметр context_id, который является индикатором того периода отчета, который вычисляется из файла instance.xml. Она содержит XSLT-переменную для каждого аргумента в формуле элемента и выдает формулу, вычисленную по прописанной схеме. Например, выражение formula:F10 - это формульная функция для следующей операции: <item id="F10" formula="$F1 + $F2" type="calc"/>

Выражение formula:F10 содержит переменные $F1 и $F2, созданные следующим образом: <xsl:variable name="F1" select="helper:get_input_value ( 'F1', $context_id)" as="xs:double"/>

Соответственно, его результатом является: <xsl:sequence select="$F1 + $F2"/>

А вот более сложный пример: <item id="F13" formula="if( ($F10 - $F10_prev) gt 0.01*$F10_prev ) then ($F10 + $F3) else ($F10)" type="calc"/>

В соответствующей функции formula:F13 переменной вычисляемого элемента $F10 присваивается значение путем вызова формульной функции с идентичным именем, параметром которой является context_id: <xsl:variable name="F10" select="formula:F10( $context_id)" as="xs:double"/>

В определении элемента F13 модификатор _prev в выражении $F10_prev указывает, что значение должно относиться к предыдущему контексту. Такие ссылки часто встречаются в финансовых формулах. Соответствующая переменная в выражении formula:F13 создается следующим образом: <xsl:variable name="F10_prev" select="formula:F10(helper:get_ previous($context_id))" as="xs:double"/>

Здесь функция helper:get_previous(context_id) просто выдает значение context_id для периода в один год, предшествующего тому, который был указан.

Если обратиться к исходным кодам, то файл

compiler.xslt (листинг 4) использовался для создания файла functions.xslt из schema.xml; файл host.xslt (листинг 5) показывает, как вызываются функции в файле

functions.xslt; файл calculated_data.xml (листинг 6) показывает результат, который получается при преобразовании instance.xml с помощью файла

host.xslt.

Все эти задачи сравнительно простые, а формулы в файле functions.xslt обладают той же гибкостью, что и формулы XPath 2.0.




Содержание  Назад  Вперед