The Planets
The first three planets are:
Each planet must have a name!
.
and
.
Чтобы проверить работу этого кода, я задал один из элементов пустым:
Mercury
.0553
58.65
1516
.983
43.4
.815
116.75
3716
.943
66.8
.
.
.
Вот как происходит обработка примера в Xalan:
C:\planets>java org.apache.xalan.xslt.Process -IN planets.xml -XSL errors.xsl -OUT new.xml
file:///C:/XSL/w.xsl: Line 18: Column 38: Each planet must have a name!
XSLT Error (javax.xml.transform.TransformerException): Stylesheet directed termination
Если вы знакомы с конструкцией if
в языках программирования, вы знаете, что инструкция if
обычно сопровождается инструкцией else
, которая выполняется при ложности условия в if
. Но в XSLT нет элемента . Для задания альтернативных ветвей выполнения XSLT служит элемент .
Элемент похож на оператор Java switch
, который позволяет сравнивать значение условия с несколькими возможными вариантами.
У элемента нет атрибутов. Он содержит один или более элементов и (не обязательно) один элемент , который в случае применения должен стоять последним.
Вот как это работает: в элемент заключаются элементы , каждый с условием true/false
. Применяется тело шаблона в первом элементе , чье условие имеет значение true
, все остальные не применяются. Последним элементом внутри элемента может быть элемент тело шаблона внутри этого элемента применяется, если ни одно из предыдущих условий не имело значения true
:
В предыдущем разделе для осуществления этого преобразования нам потребовалось три элемента :
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets
The first three planets are:
Each planet must have a name!
,
.
Теперь то же самое можно сделать при помощи единственного элемента :
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets
The first three planets are:
Each planet must have a name!
.
.
.
Нам нужно проверить, в каком месте документа мы находимся, при помощи включения нескольких элементов . У этого элемента только один атрибут:
• test
(обязательный). Принимает логическое ( Boolean
) значение ( true/false
) проверяемого условия.
Элемент содержит тело шаблона.
Атрибут проверки принимает значение true/false выражения, определяющего, будет ли применяться заключенное в элементе тело шаблона или нет. Например, вот как я добавил элементы с соответствующими знаками пунктуации для всех планет, кроме последней:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets
The first three planets are:
Each planet must have a name!
,
and
.
.
.
Эти два элемента выбирают все элементы за исключением последнего, поэтому элемент можно применить для последнего элемента . Тело шаблона в этом элементе будет применено, если ни в одном элементе в элементе условие не примет значение true
.
У элемента нет атрибутов, и он содержит тело шаблона. Вот как это выглядит в листинге 5.4.
Листинг 5.4. Применение
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets
The first three planets are:
Each planet must have a name!
,
and
.
Вот как это работает; этот код дает тот же результат, что и код, проверяющий позицию элементов при помощи :
The Planets
The first three planets are: Mercury, Venus, and Earth.
Вот еще один пример преобразования XML-XML. В этом случае я преобразую planets.xml
в новый XML-документ, сохраняя только название каждой планеты и добавляя описание:
The Planets
Mercury
Hottest
Venus
Hot
Earth
OK
Это преобразование можно реализовать, выбирая значение каждого элемента , то есть заключенный в нем текст (заметьте, что такого рода строки в XSLT учитывают регистр) (листинг 5.5).
Листинг 5.5. Второй пример
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets
Each planet must have a name!
Hottest
Hot
OK
Вот и все.
Предположим теперь, что нам нужно добавить в каждый элемент атрибут COLOR
:
Mercury
.0553
58.65
1516
.983
43.4
Venus
.815
116.75
3716
.943
66.8
Earth
Читать дальше