мне нужен хак, чтобы сделать xslt, давайте установим новые значения для переменных - PullRequest
2 голосов
/ 09 июня 2011

Я читал, что в отличие от языков программирования, XSLT не позволяет нам устанавливать новое значение для переменной.Мне просто интересно, есть ли какие-нибудь хаки, чтобы обойти это ограничение, которое используют люди?потому что возможность сброса значения переменной по своей сути полезна AFAIK

Ну, по крайней мере, если бы мы могли сбросить значение переменной, я мог бы решить мою проблему здесь: как не повторить повторяющуюся логику в моем коде xslt?

Ответы [ 3 ]

3 голосов
/ 09 июня 2011

Переменные XSLT должны предназначаться в традиционном смысле математики, а не как переменные в обычном смысле процедурных языков, таких как C ++.

XSLT не позволяет нам устанавливать новое значениепеременная.

На самом деле это не совсем так, в том смысле, что переменные находятся в элементе XSLT, в котором они содержатся.

Поэтому, если вы определяете переменную как дочернюю для xsl:stylesheet, вы должны рассматривать ее как глобальную константу.

Но если вы определяете переменную как дочернюю для xsl:template, тогда как вынужно рассматривать вашу переменную как локальную константу только в текущем контексте шаблона, в области преобразования вы можете рассматривать ее как переменную, которая может принимать другое значениепо шаблону контекст .То же самое относится и к именованному шаблону или функциям.

Есть ли какие-нибудь хаки, чтобы обойти это ограничение?

Просто привыкните работать с ними функционально.


Абстрактный пример:

Если вы определяете переменную как дочернюю для xsl:stylesheet, чтобы они получали значения в соответствии с параметрами преобразования, вы можете рассматривать переменную как переменную в области видимостипреобразования.

Представьте себе таблицу стилей с параметрами как функцию:

F(x)

и шаблон с переменной, как подфункцию в F(x), скажем:

T(y)

Для того, чтобы вы могли иметь реферат:

F(x) = G( T(y), x )

, вы также можете иметь, например:

F(x) = G( T(y(x)), x )

в зависимости от того, как вы разрабатываете свою таблицу стилей.

3 голосов
/ 09 июня 2011

Я читал, что в отличие от языков программирования, XSLT не позволяет нам устанавливать новое значение для переменной.

Два неправильных утверждения здесь :

  1. "в отличие от языков программирования, XSLT".XSLT - это язык программирования.Он входит в группу языков программирования под названием «Функциональные языки программирования».Ближайшее правильное утверждение к тому, что вы пытаетесь сказать: «в отличие от * процедурных» языков программирования »

  2. « XSLT не позволяет нам устанавливать новое значение для переменной ». Опятьневерно - это не XSLT, который не разрешает что-то - это любой функциональный язык программирования, а XSLT - это функциональный язык программирования.

Мне просто интересноесть ли хаки, чтобы обойти это ограничение, которое используют люди?

Есть хаки нет , поскольку людям не нужны такие хаки. Люди, которые не могут жить, не имея возможностиизмените значение переменной, просто используйте процедурный язык программирования.

, поскольку возможность сброса значения переменной по своей природе полезна AFAIK

На самом деле, обладание такой способностью вредно в большинстве случаев . Это делает намного более трудным понимание программы и / или проверку ее правильности с помощью верификаторов корректности программы. Любая программас побочными эффектами также труднее оптимизировать, и любые такие программы могут быть менее оптимизированы, чем неизменный код, который также решает ту же проблему.

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

Хорошим примером того, что можно сделать с помощью чистого XSLT , является библиотека FXSL .FXSL предоставляет набор функций / шаблонов для решения больших классов задач, среди которых довольно сложные, такие как поиск любой степени (x^y) или логарифма, или основные тригонометрические функции, или решение любого уравнения f(x) = 0 и т. Д...

Другие примеры функций FXSL находятся в области обработки текста - токенизация слов, проверка орфографии, построение соответствия и т. Д. ...

Еще более сложные задачи, реализованные с помощью функций FXSL : универсальный парсер LR-1, парсеры для JSON и XPath 2.0, генерация последовательности случайных чисел, числовое интегрирование и дифференцирование, ... и т. Д.

Все это делается без изменения каких-либо переменных - немало смущает тот факт, что «XSLT не позволяет этого»:)

1 голос
/ 09 июня 2011

В XSLT у вас есть константы, а не переменные. Понятия не имею, почему они называют их переменными. Они не меняются. Они постоянны. Единственный известный мне взлом - это взломать ваш разум на понимание XSLT. Не лучшее решение, я знаю ... но это XSLT.

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