I. Элегантный код XSLT
Часто можно найти примеры прекрасного кода XSLT, особенно когда XSLT используется в качестве функционального языка программирования .
Примеры см. в этой статье в FXSL 2.0 - библиотека функционального программирования для XSLT 2.0.
В качестве языка FP XSLT также является декларативным языком . Это, помимо прочего, означает, что каждый заявляет, указывает существующие отношения.
Такое определению часто не требует никакого дополнительного кода для получения результата - оно само является собственной реализацией, или определением исполняемого файла или спецификацией исполняемого файла .
Вот небольшой пример .
Это выражение XPath 2.0 определяет" Максимум Главный фактор натурального числа ":
if(f:isPrime($pNum))
then $pNum
else
for $vEnd in xs:integer(floor(f:sqrt($pNum, 0.1E0))),
$vDiv1 in (2 to $vEnd)[$pNum mod . = 0][1],
$vDiv2 in $pNum idiv $vDiv1
return
max((f:maxPrimeFactor($vDiv1),f:maxPrimeFactor($vDiv2)))
Чтобы произнести это по-английски , максимальный простой множитель числа pNum
является самим числом, если pNum
является простым, в противном случае если vDiv1
и vDiv2
являются двумя факторами pNum
, то максимальный простой коэффициент pNum
равен большее из максимальных простых множителей: vDiv1
и vDiv2
.
Как мы используем это для фактического вычисления Максимального простого множителя в XSLT? Мы просто обернем определение выше в <xsl:function>
и ... получим результат!
<xsl:function name="f:maxPrimeFactor" as="xs:integer">
<xsl:param name="pNum" as="xs:integer"/>
<xsl:sequence select=
"if(f:isPrime($pNum))
then $pNum
else
for $vEnd in xs:integer(floor(f:sqrt($pNum, 0.1E0))),
$vDiv1 in (2 to $vEnd)[$pNum mod . = 0][1],
$vDiv2 in $pNum idiv $vDiv1
return
max((f:maxPrimeFactor($vDiv1),f:maxPrimeFactor($vDiv2)))
"/>
</xsl:function>
Затем можно вычислить MPF для любого натурального числа , например:
f:maxPrimeFactor(600851475143)
= 6857
Что касается эффективности, ну, это преобразование занимает всего 0,109 сек .
Другие примеры элегантного и эффективного кода XSLT :
II. Некоторые правила
Вот некоторые правила написания «качественного XSLT-кода», взятые из блога Мукула Ганди .
Их можно проверить / применить с помощью инструмента , разработанного Mukul :
DontUseDoubleSlashOperatorNearRoot: Избегайте использования оператора // около корня большого дерева.
DontUseDoubleSlashOperator: Избегайте использования оператора // в выражениях XPath.
SettingValueOfVariableIncorrectly: присваивать значение переменной с использованием синтаксиса select при назначении строкового значения.
EmptyContentInInstructions: Не используйте пустой контент для таких инструкций, как 'xsl: for-each' 'xsl: if' 'xsl: when' и т. Д.
DontUseNodeSetExtension: Не использовать функцию расширения набора узлов при использовании XSLT 2.0.
RedundantNamespaceDeclarations: В элементе xsl: stylesheet есть избыточные объявления пространства имен.
UnusedFunction: функции таблицы стилей не используются.
UnusedNamedTemplate: именованные шаблоны в таблице стилей не используются.
UnusedVariable: переменная не используется в таблице стилей.
UnusedFunctionTemplateParameter: параметр функции или шаблона не используется в теле функции / шаблона.
TooManySmallTemplates: слишком много шаблонов с низким уровнем детализации в таблице стилей (10 или более).
MonolithicDesign: Использование одного шаблона / функции в таблице стилей. Вы можете модулировать код.
OutputMethodXml: использование метода вывода «xml» при генерации кода HTML.
NotUsingSchemaTypes: таблица стилей не использует встроенные типы схем (xs: string и т. Д.) При работе в режиме XSLT 2.0.
UsingNameOrLocalNameFunction: использование функции name (), когда возможно использование local-name () (и наоборот).
FunctionTemplateComplexity: Размер / сложность функции или шаблона высоки. Необходим рефакторинг кода.
NullOutputFromStylesheet: таблица стилей не генерирует никакого полезного вывода. Пожалуйста, ознакомьтесь с логикой таблицы стилей.
UsingNamespaceAxis: использование устаревшей оси пространства имен при работе в режиме XSLT 2.0.
CanUseAbbreviatedAxisSpecifier: Использование спецификаторов длинной оси, таких как child ::, attribute :: или parent :: node ().
UsingDisableOutputEscaping: для атрибута disable-output-escaping установлено значение 'yes'. Пожалуйста, посмотрите на логику таблицы стилей.
NotCreatingElementCorrectly: Создание узла элемента с использованием инструкции xsl: element, когда это было возможно напрямую.
AreYouConfusingVariableAndNode: Возможно, вы путаете ссылку на переменную со ссылкой на узел. (предоставлено Аленом Бенедетти)
IncorrectUseOfBooleanConstants: неправильно использовать логические константы как «true» или «false». (предоставлено Тони Лавинио)
ShortNames: использование имени одного символа для переменной / функции / шаблона. Используйте значимые имена для этих функций.
NameStartsWithNumeric: имя переменной / функции / шаблона начинается с цифры