Язык преобразований XSL


Разрешение конфликтов в правилах шаблона


Может оказаться, что исходный узел соответствует сразу нескольким правилам шаблона. Правило шаблона, которое должно использоваться, определяется следующим образом:

Во-первых, из рассмотрения исключаются все соответствующие узлу правила шаблона, которые имеют более низкий , чем проверяемое правило шаблона и правила с наивысшим приоритетом импорта.

Затем из рассмотрения исключаются все соответствующие узлу правила шаблона, которые имеют более низкий приоритет чем данное соответствующее правило шаблона и правила с наивысшим приоритетом. Приоритет правила шаблона задается атрибутом priority. Значением этого атрибута должно быть реальное число (положительное или отрицательное), соответствующее сценарию с необязательным начальным символом минус (-). Приоритет по умолчанию вычисляется следующим образом:

Если образец содержит несколько альтернатив, разделенных символом |, то он обрабатывается также как набор из правил шаблона, по одному на каждую из представленных альтернатив.

Если образец имеет вид , которому предшествует , или имеет вид processing-instruction(), которому предшествует , то приоритет считается равным 0.

Если образец имеет вид :*, которому предшествует , то его приоритет равен -0.25.

В противном случае, если образец состоит только из , которому предшествует , то его приоритет равен -0.5.

В остальных случаях приоритет равен 0.5.

Таким образом, самый общий тип образцов (образец, проверяющий узел определенного типа и с определенным расширенным именем) имеет приоритет 0. Следующий, более общий тип образца (образец, проверяющий узел определенного типа и с расширенным именем и определенным URI пространства имен) имеет приоритет -0.25. Еще более общие образцы (образцы, проверяющие лишь узлы определенных типов) имеют приоритет -0.5. Образцы, еще более специальные, чем самый общий тип образца, имеют приоритет 0.5.

Если и после этого останется более одного правила шаблона, соответствующего узлу, фиксируется ошибка. XSLT процессор может сигнализировать о такой ошибке, если же он этого не делает, то должен ее обработать, выбрав среди оставшихся соответствующих узлу правил шаблона то, которое в стиле было указано последним.



Содержание раздела