Главная » XSLT » Как ужиться с расширенной системой типов в XPath 2.0

0

Задача

Более строгая типизации в XPath 2.0 заставляет вас проклинать W3C и с тоской вспоминать о Perl.

Решение

Большая часть несовместимостей между версиями XPath/XSLT 1.0 и 2.0 проис­текает из-за ошибок типизации, причем это даже не зависит от наличия или от­сутствия схемы. Многих проблем, которые связаны с XPath и возникают при пе­реносе кода в версию 2.0, можно избежать, если запускать программу в режиме совместимости с версией 1.0.

<xsl:stylesheet version="1.0"> <!– … –> </xsl:stylesheet>

Мне думается, что со временем вы захотите отказаться от режима совмести­мости. В XPath 2.0 есть несколько способов выполнить преобразование типов. Во- первых, можно напрямую обратиться к функциям преобразования.

(: Преобразовать первый дочерний элемент X контекстного узла в число. :) number(X[1]) + 17

(: Преобразовать число, хранящееся в переменной $n, в строку. :) concat("id-", string($n))

В XPath 2.0 есть также конструкторы типов, так что управлять интерпретаци­ей строки можно явно.

(: Сконструировать дату из строки. :) xs:date("2005-06-01")

(: Сконструировать число с двойной точностью из строки. :) xs:double("1.1e18") + xs:double("23000")

Наконец, в XPath есть операторы castable as, cast as и treat as. Обычно бывает достаточно двух первых.

if ($x castable as xs:date) then $x cast as xs:date else xs:date("1970-01-01")

Оператор treat as не выполняет преобразования типов, а служит утверждением, которое процессор XPath воспринимает как обещание подавать во время выполнения значение указанного типа. Если обещание будет нарушено, возникнет ошибка. Опера­тор treat as был введен для того, чтобы разработчики XPath могли реализовать ста­тическую (во время компиляции) проверку типов в дополнение к динамической про­верке, которая позволила бы программистам избирательно отключать статический контроль. В реализациях XSLT 2.0 статический контроль типов, скорее всего, будет редкостью, так что пока можно спокойно игнорировать оператор treat as. Необходимость в нем гораздо вероятнее в более продвинутых процессорах языка XQuery, где статиче­ский контроль позволяет выполнять различные оптимизации.

Обсуждение

Запуск процессора XSLT 2.0 в режиме совместимости с версией 1.0 не означа­ет, что новые средства 2.0 окажутся недоступными. В этом режиме просто активи­руются некоторые правила преобразования, существовавшие в XPath 1.0.

?               Допускается использовать нечисловые типы в контексте, где ожидается чис­ло. При этом автоматически выполняется преобразование, заключающееся в приведении к атомарному значению с последующим вызовом функции number().

(: В режиме совместимости вычисление следующего выражения дает 18.1, а в версии 2.0 приведет к ошибке. :)

"11" + "17"

?               Допускается использование не-строковых типов в контексте, где ожидает­ся строка. При этом автоматически выполняется преобразование, заключа­ющееся в приведении к атомарному значению с последующим вызовом функции string().

(: В режиме совместимости вычисление следующего выражения дает 2, а в версии 2.0 приведет к ошибке. :) string-length(1 + 2 + 3 + 4 + 5)

?               Из последовательностей длины 2 и более автоматически удаляются все элементы, кроме первого, в контексте, где ожидается единственное значе­ние. Так часто бывает при передаче функции результата вычисления путе­вого выражения.

<poem>

<line>There once was a programmer from Nantucket.</line> <line>Who liked his bits in a bucket.</line> <line>He said with a grin</line> <line>and drops of coffee on his chin,</line> <line>"if XSLT had a left-shift, I would love it!"</line> </poem>

(: В режиме совместимости оба выражения дают 43, а в версии 2.0 первое приводит к ошибке. :) string-length(/poem/line) string-length(/poem/line[1])

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии