XML, XSLT и DTD в примерах

XML в примерах
Автор: Miloslav Nic
Перевод: Г.Стаценко
Оригинал: http://zvon.org/xxl/XMLTutorial/General/book.html
5 мая 2002
Пространства имен XML в примерах
Автор: Miloslav Nic
Перевод: А.Серов
Оригинал: http://zvon.org/xxl/NamespaceTutorial/Output/index.html
28 октября 2002
DTD в примерах
Автор: Miloslav Nic
Перевод: В.Ярошевич, П.Головин
Оригинал: http://www.zvon.org/xxl/DTDTutorial/General/book.html
5 октября 2002
XSLT в примерах
Автор: Miloslav Nic
Перевод: В.Ярошевич
Оригинал: http://www.zvon.org/xxl/XSLTutorial/Output
21 февраля 2002
XPath в примерах
Автор: Miloslav Nic, Jiri Jirat
Перевод: В.Ярошевич
Оригинал: http://www.zvon.org/xxl/XPathTutorial/General/examples.html
29 августа 2002
Школа XPath
Автор: В.Ярошевич
Raleigh.ru Copyright © 2002
Школа WSDL
Автор: В.Ярошевич
Raleigh.ru Copyright © 2002


About Chm4You!

О программе Chm4You!
Разработчик: Сергей Тарасенко (aka Tarantul)
Версия: Chm4You! 1.2
Веб-сайт: http://supex.by.ru
Почта: tarantuls@ukr.net

Компилятор: hhc.exe 4.78.8702.0 (Microsoft)
Динамическая библиотека: hha.dll 4.78.8702.0 (Microsoft)
Декомпилятор: hh.exe 4.78.8702.0 (Microsoft)


DTD в примерах

XML-документ является допустимым, если он имеет ассоциированное определение типа документа (DTD, document type definition) и документ соответствует изложенным в нем ограничениям. DTD должен указываться перед первым элементом в документе. Имя, указанное за словом DOCTYPE, должно соответствовать имени корневого элемента.

DTD

<!ELEMENT tutorial (#PCDATA)>
Документ может содержать лишь корневой элемент tutorial, который в свою очередь может содержать некоторый текст.

Допустимые документы

<!DOCTYPE tutorial SYSTEM "tutorial.dtd">

<tutorial>Это XML-документ</tutorial>

Допустимый документ, содержащий некоторый текст.

<!DOCTYPE tutorial SYSTEM "tutorial.dtd">

<tutorial/>

Этот документ также является допустимым.

Документы с ошибками

<!DOCTYPE tutorial SYSTEM "tutorial.dtd">

<text>Это XML-документ</text>

Корневой документ не соответствует данному DTD.


DTD в примерах

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

DTD

<!ELEMENT XXX (AAA , BBB)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
Корневой элемент XXX должен содержать ровно один элемент AAA, а за ним - ровно один BBB. Элементы AAA и BBB могут содержать некоторый текст, но не могут содержать другие элементы.

Допустимые документы

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA>Start</AAA>
<BBB>End</BBB>
</XXX>

Допустимый документ, содержащий некоторый текст.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> <AAA/> <BBB/> </XXX>

Этот документ также является допустимым.

Документы с ошибками

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> <AAA/> ___ </XXX>

Отсутствует элемент BBB.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> <BBB/> <AAA/> </XXX>

Элемент BBB должен следовать за элементом AAA.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> <AAA/> <BBB/> <BBB/> </XXX>

Корневой элемент XXX может содержать лишь один элемент BBB.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> Elements: <AAA/> <BBB/> </XXX>

Корневой элемент XXX не должен содержать какой-либо текст.


DTD в примерах

Если имя элемента в DTD сопровождается звездочкой [*], то это означает, что элемент может присутствовать последовательно ноль, один или несколько раз.

DTD

<!ELEMENT XXX (AAA* , BBB)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
Корневой элемент XXX может содержать один или несколько элементов AAA, за которыми должен следовать ровно один элемент BBB. Элемент BBB обязательно должен присутствовать.

Допустимые документы

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> <AAA/> <BBB/> </XXX>

Допустимый документ.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> <BBB/> </XXX>

Другой допустимый документ. Элемент AAA опущен.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA/> <AAA/>
<AAA/> <AAA/>
<AAA/> <AAA/>
<AAA/> <BBB/>
</XXX>

Несколько элементов AAA могут содержаться внутри документа.

Документы с ошибками

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> ___ </XXX>

Отсутствует элемент BBB.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> <BBB/> <AAA/> </XXX>

Элемент BBB должен следовать за элементом AAA.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA/> <AAA/>
<AAA/> <AAA/>
<BBB/> <AAA/>
<AAA/>
</XXX>

Элемент AAA не может следовать за элементом BBB.


DTD в примерах

Если имя элемента в DTD сопровождается плюсом [+], то это означает, что элемент может присутствовать последовательно один или несколько раз.

DTD

<!ELEMENT XXX (AAA+ , BBB)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
Корневой элемент XXX должен содержать один или несколько элементов AAA, за которыми должен следовать ровно один элемент BBB. Элемент BBB обязательно должен присутствовать.

Допустимые документы

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> <AAA/> <BBB/> </XXX>

Допустимый документ.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA/> <AAA/>
<AAA/> <AAA/>
<AAA/> <AAA/>
<AAA/> <BBB/>
</XXX>

Внутри документа могут встречаться несколько элементов AAA.

Документы с ошибками

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> ___ ___ </XXX>

Отсутствуют элементы AAA и BBB.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> ___<BBB/> </XXX>

Хотя бы один элемент AAA должен присутствовать.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> <BBB/> <AAA/> </XXX>

Элемент BBB долден следовать за элементом AAA.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA/> <AAA/> <AAA/>
<AAA/> <BBB/> <AAA/>
<AAA/>
</XXX>

Элемент AAA не может идти за элементом BBB.


DTD в примерах

Если имя элемента в DTD сопровождается знаком вопроса [?], то это означает, что этот элемент может ни разу встречаться или встречаться ровно один раз.

DTD

<!ELEMENT XXX (AAA? , BBB)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
Корневой элемент XXX может иметь дочерний элемент AAA, за которым должен следовать ровно один элемент BBB. Элемент BBB обязательно должен присутствовать.

Допустимые документы

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> <AAA/> <BBB/> </XXX>

Допустимый документ.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> <BBB/> </XXX>

Наличие элемента AAA не обязательно.

Документы с ошибками

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> ___ </XXX>

Пропущен элемент BBB.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA/> <AAA/>
<AAA/> <AAA/>
<AAA/> <AAA/>
<AAA/> <BBB/>
</XXX>

Не более одного элемента AAA может быть внутри документа.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX> <BBB/> <AAA/> </XXX>

Элемент BBB должен идти за элементом AAA.


DTD в примерах

В этом примере используется комбинация модификаторов [ + * ?].

DTD

<!ELEMENT XXX (AAA? , BBB+)>
<!ELEMENT AAA (CCC? , DDD*)>
<!ELEMENT BBB (CCC , DDD)>
<!ELEMENT CCC (#PCDATA)>
<!ELEMENT DDD (#PCDATA)>
Корневой элемент XXX может, но не обязан, содержать один элемент AAA,за которым должен идти один или несколько элементов BBB. Элемент AAA в свою очередь может содержать один элемент CCC и несколько элементов DDD. Элемент BBB должен содержать ровно один элемент CCC и один элемент DDD.

Допустимые документы

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA>
<CCC/><DDD/>
</AAA>
<BBB>
<CCC/><DDD/>
</BBB>
</XXX>

Допустимый документ.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA/>
<BBB>
<CCC/><DDD/>
</BBB>
</XXX>

Элементы внутри AAA не являются обязательными.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<BBB>
<CCC/><DDD/>
</BBB>
</XXX>

Элемент AAA может быть опущен.

Документы с ошибками

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA/>
<BBB/>
</XXX>

Элемент BBB должен содержать элементы CCC и DDD.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA>
<CCC/><CCC/>
<DDD/><DDD/>
</AAA>
<BBB>
<CCC/><DDD/>
</BBB>
</XXX>

Элемент AAA может содержать не более одного элемента CCC.


DTD в примерах

С помощью символа [ | ] мы можем указать, что присутствовать должен один из нескольких элементов.

DTD

<!ELEMENT XXX (AAA , BBB)>
<!ELEMENT AAA (CCC , DDD)>
<!ELEMENT BBB (CCC | DDD)>
<!ELEMENT CCC (#PCDATA)>
<!ELEMENT DDD (#PCDATA)>
Корневой элемент XXX должен содержать один элемент AAA, за которым должен следовать один элемент BBB. Элемент AAA должен содержать последовательно один элемент CCC и один элемент DDD. Элемент BBB, в свою очередь, должен содержать либо один элемент CCC, либо один элемент DDD.

Допустимые документы

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA>
<CCC/> <DDD/>
</AAA>
<BBB>
<CCC/>
</BBB>
</XXX>

Допустимый документ.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA>
<CCC/> <DDD/>
</AAA>
<BBB>
<DDD/>
</BBB>
</XXX>

Другой допустимый документ.

Документы с ошибками

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA>
<CCC/> <DDD/>
</AAA>
<BBB>
<CCC/> <DDD/>
</BBB>
</XXX>

Элемент BBB может содержать или элемент CCC, или DDD, но не может содержать одновременно оба.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA>
<CCC/> <DDD/>
</AAA>
<BBB>
<DDD/> <CCC/>
</BBB>
</XXX>

Элемент BBB может содержать или элемент CCC, или DDD, но не может содержать одновременно оба.


DTD в примерах

Текст может присутствовать в документе наравне с элементами.

DTD

<!ELEMENT XXX (AAA+ , BBB+)>
<!ELEMENT AAA (BBB | CCC )>
<!ELEMENT BBB (#PCDATA | CCC )*>
<!ELEMENT CCC (#PCDATA)>
Элемент AAA может содержать или BBB, или CCC. В свою очередь, элемент BBB может содержать любую комбинацию текста и элементов CCC.

Допустимые документы

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA>
<CCC>Строго один элемент.</CCC>
</AAA>
<AAA>
<BBB>
<CCC/>
<CCC/>
<CCC/>
</BBB>
</AAA>
<BBB/>
<BBB>
Это <CCC/> комбинация <CCC/> элементов <CCC> CCC </CCC> и текста <CCC/>.
</BBB>
<BBB>
Только текст.
</BBB>
</XXX>

Допустимый документ, демонстрирующий некоторые возможные варианты.

Документы с ошибками

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA>
Элемент: <CCC/>
</AAA>
<BBB>
Элемент: <CCC/>
</BBB>
</XXX>

Элемент AAA не может содержать текст.


DTD в примерах

Атрибуты используются для того, чтобы связать с элементами пары имя-значение. Описание атрибута может быть расположено только в открывающем и пустом тегах. Определение начинается с объявления ATTLIST, затем следует имя элемента, к которому относятся атрибуты, затем следует определение отдельных атрибутов.

DTD

<!ELEMENT attributes (#PCDATA)>
<!ATTLIST attributes
aaa CDATA #REQUIRED
bbb CDATA #IMPLIED>
Атрибут типа CDATA может содержать любые символы, если они удовлетворяют ограничениям на корректность (well formedness) документа. Модификатор #REQUIRED указывает на то, что этот атрибут должен всегда присутствовать, атрибут с модификатором #IMPLIED является необязательным.

Допустимые документы

<!DOCTYPE attributes SYSTEM "tutorial.dtd">

<attributes aaa="#d1" bbb="*~*">
Текст
</attributes>

Атрибут типа CDATA может содержать любые символы, удовлетворяющие ограничениям на корректность документа.

<!DOCTYPE attributes SYSTEM "tutorial.dtd">

<attributes bbb="$25" aaa="13%">
Text
</attributes>

Порядок атрибутов не важен

<!DOCTYPE attributes SYSTEM "tutorial.dtd">

<attributes aaa="#d1" />

Атрибут bbb может быть опущен, так как является необязательным

Документы с ошибками

<!DOCTYPE attributes SYSTEM "tutorial.dtd">

<attributes ___ bbb="X24"/>

Атрибут aaa является обязательным. Поэтому он всегда должен присутствовать.


DTD в примерах

Атрибут типа CDATA может содержать любые символы, если они удовлетворяют условиям корректности документа. Атрибут типа NMTOKEN может содержать только буквы, цифры, точку [ . ], тире [ - ], подчеркивание [ _ ] и двоеточие [ : ]. NMTOKENS может содержать те же символы, что и NMTOKEN, плюс пробельные символы: символы пробела, возврата каретки, перевода строки или табуляции.

DTD

<!ELEMENT attributes (#PCDATA)>
<!ATTLIST attributes
aaa CDATA #IMPLIED
bbb NMTOKEN #REQUIRED
ccc NMTOKENS #REQUIRED>
Атрибуты bbb и ccc должны всегда присутствовать, атрибут aaa является необязательным.

Допустимые документы

<!DOCTYPE attributes SYSTEM "tutorial.dtd">

<attributes aaa="#d1" bbb="a1:12" ccc=" 3.4 div -4"/>

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

<!DOCTYPE attributes SYSTEM "tutorial.dtd">

<attributes bbb="a1:12"
ccc="3.4
div
-4"/>

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

Документы с ошибками

<!DOCTYPE attributes SYSTEM "tutorial.dtd">

<attributes aaa="#d1" bbb="#d1" ccc="#d1"/>

Символ # запрещен а атрибутах типов NMTOKEN и NMTOKENS.

<!DOCTYPE attributes SYSTEM "tutorial.dtd">

<attributes bbb="A B C" ccc="A B C"/>

Пробельные символы запрещены в атрибуте типа NMTOKEN.


DTD в примерах

Значение атрибута типа ID может содержать только символы, разрешенные для типа NMTOKEN, и должно начинаться с буквы. Никакой тип элементов не может иметь более одного определенного атрибута типа ID. Значение атрибута типа ID должно быть уникальным среди всех значений всех атрибутов данного типа.

DTD

<!ELEMENT XXX (AAA+ , BBB+ , CCC+)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ELEMENT CCC (#PCDATA)>
<!ATTLIST AAA
id ID #REQUIRED>
<!ATTLIST BBB
code ID #IMPLIED
list NMTOKEN #IMPLIED>
<!ATTLIST CCC
X ID #REQUIRED
Y NMTOKEN #IMPLIED>
Атрибуты id, code и X однозначно определяют свой элемент.

Допустимые документы

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA id="a1"/>
<AAA id="a2"/>
<AAA id="a3"/>
<BBB code="QWQ-123-14-6" list="14:5"/>
<CCC X="zero" Y="16" />
</XXX>

Все значения ID являются уникальными.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA id="L12"/>
<BBB code="QW" list="L12"/>
<CCC X="x-0" Y="QW" />
<CCC X="x-1" Y="QW" />
</XXX>

Атрибуты list и Y имеют тип NMTOKEN, а не ID. Поэтому они могут иметь одинаковое значение в нескольких элементах или такое же значение, как атрибут типа ID.

Документы с ошибками

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA id="L12"/>
<BBB code="#QW" list="L12"/>
<CCC X="12" Y="QW" />
</XXX>

Атрибут типа ID не может начинаться с цифры или содержать символы, запрещенные для типа NMTOKEN.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA id="L12"/>
<BBB code="QW" list="L12"/>
<CCC X="ZA" Y="QW" />
<CCC X="ZA" Y="QW" />
</XXX>

Атрибут типа ID должен иметь уникальное значение.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA id="L12"/>
<BBB code="QW" list="L12"/>
<CCC X="L12" Y="QW" />
</XXX>

Атрибут типа ID должен иметь уникальное значение. Оба атрибута (id и X) имеют тип ID.


DTD в примерах

Значение атрибута IDREF должно соответствовать значению некоторого атрибута ID, содержащегося в документе. Значение атрибута IDREFS может содержать несколько ссылок на элементы с атрибутом ID, разделенные пробельными символами.

DTD

<!ELEMENT XXX (AAA+ , BBB+, CCC+, DDD+)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ELEMENT CCC (#PCDATA)>
<!ELEMENT DDD (#PCDATA)>
<!ATTLIST AAA
mark ID #REQUIRED>
<!ATTLIST BBB
id ID #REQUIRED>
<!ATTLIST CCC
ref IDREF #REQUIRED>
<!ATTLIST DDD
ref IDREFS #REQUIRED>
Атрибуты id и mark однозначно определяют свой элемент. Атрибуты ref ссылаются на эти элементы.

Допустимые документы

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA mark="a1"/>
<AAA mark="a2"/>
<AAA mark="a3"/>
<BBB id="b001" />
<CCC ref="a3" />
<DDD ref="a1 b001 a2" />
</XXX>

Значения всех атрибутов типа ID уникальны, и все IDREF и IDREFS указывают на элементы с существующими ID.

Документы с ошибками

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA mark="a1"/>
<AAA mark="a2"/>
<BBB id="b01" />
<CCC ref="a3" />
<DDD ref="a1 b001 a2" />
</XXX>

Нет атрибутов типа ID со значениями a3 или b001.

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA mark="a1"/>
<AAA mark="a2"/>
<AAA mark="a3"/>
<BBB id="b001" />
<CCC ref="a1 b001 a2" />
<DDD ref="a1 b001 a2" />
</XXX>

Атрибут ref элемента CCC имеет тип IDREF. Он может содержать только одну ссылку.


DTD в примерах

В DTD могут быть перечислены разрешенные значения атрибута.

DTD

<!ELEMENT XXX (AAA+, BBB+)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ATTLIST AAA
true ( yes | no ) #REQUIRED>
<!ATTLIST BBB
month (1|2|3|4|5|6|7|8|9|10|11|12) #IMPLIED>
В этом DTD точно перечислены разрешенные значения.

Допустимые документы

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA true="yes"/>
<AAA true="no"/>
<AAA true="yes"/>
<BBB month="8" />
<BBB month="2" />
<BBB month="12" />
</XXX>

Все значения указаны в DTD.

Документы с ошибками

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA true="yes"/>
<AAA true="no"/>
<AAA true="maybe"/>
<BBB month="8" />
<BBB month="2" />
<BBB month="16" />
</XXX>

Атрибут true не может иметь значение "maybe", атрибут month не может иметь значение "16".


DTD в примерах

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

DTD

<!ELEMENT XXX (AAA+, BBB+)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ATTLIST AAA
true ( yes | no ) "yes">
<!ATTLIST BBB
month NMTOKEN "1">
Оба атрибута являются необязательными. Заданы их значения по умолчанию.

Допустимые документы

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA true="yes"/>
<AAA true="no"/>
<AAA/>
<BBB month="8" />
<BBB month="2" />
<BBB/>
</XXX>

Значения true равны yes, no и yes. Значения month равны 8, 2 и 1.


DTD в примерах

Элемент может быть определен как EMPTY. В этом случае он может содержать только атрибуты и не может содержать текст.

DTD

<!ELEMENT XXX (AAA+)>
<!ELEMENT AAA EMPTY>
<!ATTLIST AAA
true ( yes | no ) "yes">
Элемент AAA может содержать только атрибуты, но не текст.

Допустимые документы

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA true="yes"/>
<AAA true="no"></AAA>
</XXX>

Обе формы записи разрешены. Во втором случае, закрывающий тег должен следовать непосредственно за открывающим.

Документы с ошибками

<!DOCTYPE XXX SYSTEM "tutorial.dtd">

<XXX>
<AAA true="yes"/>
<AAA true="no"></AAA>
<AAA> </AAA>
<AAA>Hello!</AAA>
</XXX>

Элемент AAA не может содержать текст, и открывающий тег должен быть немедленно закрыт.


DTD в примерах

Страница 1 | XML-документ является допустимым, если он имеет ассоциированное определение типа документа (DTD, document type definition) и документ соответствует изложенным в нем ограничениям. DTD должен указываться перед первым элементом в документе. Имя, указанное за словом DOCTYPE, должно соответствовать имени корневого элемента.
Страница 2 | Элементы, которые могут быть дочерними по отношению к конкретному элементу, должны быть перечислены в модели содержимого через запятую.
Страница 3 | Если имя элемента в DTD сопровождается звездочкой [*], то это означает, что элемент может присутствовать последовательно ноль, один или несколько раз.
Страница 4 | Если имя элемента в DTD сопровождается плюсом [+], то это означает, что элемент может присутствовать последовательно один или несколько раз.
Страница 5 | Если имя элемента в DTD сопровождается знаком вопроса [?], то это означает, что этот элемент может ни разу встречаться или встречаться ровно один раз.
Страница 6 | В этом примере используется комбинация модификаторов [ + * ?].
Страница 7 | С помощью символа [ | ] мы можем указать, что присутствовать должен один из нескольких элементов.
Страница 8 | Текст может присутствовать в документе наравне с элементами.
Страница 9 | Атрибуты используются для того, чтобы связать с элементами пары имя-значение. Описание атрибута может быть расположено только в открывающем и пустом тегах. Определение начинается с объявления ATTLIST, затем следует имя элемента, к которому относятся атрибуты, затем следует определение отдельных атрибутов.
Страница 10 | Атрибут типа CDATA может содержать любые символы, если они удовлетворяют условиям корректности документа. Атрибут типа NMTOKEN может содержать только буквы, цифры, точку [ . ], тире [ - ], подчеркивание [ _ ] и двоеточие [ : ]. NMTOKENS может содержать те же символы, что и NMTOKEN, плюс пробельные символы: символы пробела, возврата каретки, перевода строки или табуляции.
Страница 11 | Значение атрибута типа ID может содержать только символы, разрешенные для типа NMTOKEN, и должно начинаться с буквы. Никакой тип элементов не может иметь более одного определенного атрибута типа ID. Значение атрибута типа ID должно быть уникальным среди всех значений всех атрибутов данного типа.
Страница 12 | Значение атрибута IDREF должно соответствовать значению некоторого атрибута ID, содержащегося в документе. Значение атрибута IDREFS может содержать несколько ссылок на элементы с атрибутом ID, разделенные пробельными символами.
Страница 13 | В DTD могут быть перечислены разрешенные значения атрибута.
Страница 14 | Если атрибут является необязательным, может быть определено значение по умолчанию, использующееся в случае, когда атрибут отсутствует.
Страница 15 | Элемент может быть определен как EMPTY. В этом случае он может содержать только атрибуты и не может содержать текст.


Пространства имен XML в примерах

В примерах использованы три искусственных набора элементов: набранные маленькими буквами, большими буквами и x+<число>. Человек легко может распознать, к какому из наборов принадлежит тот или иной элемент. Однако, компьютер не может делать подобных умозрительных заключений, поэтому нужно определить некий логический механизм.

<aaa>
<bbb>
<ccc/>
</bbb>
<BBB>
<CCC/>
</BBB>
<x111>
<x222/>
</x111>
</aaa>


Пространства имен XML в примерах

Для объявления пространств имён используются зарезервированные атрибуты, начинающиеся с xmlns. Вы можете объявить пространство имён для каждого элемента, который вы используете, но такой подход весьма утомителен. Кроме того, получившийся код будет трудно читать.

<aaa xmlns:lower="http://zvon.org/lowercase">
<bbb xmlns:lower="http://zvon.org/lowercase">
<ccc xmlns:lower="http://zvon.org/lowercase"/>
</bbb>
<BBB xmlns:upper="http://zvon.org/uppercase">
<CCC xmlns:upper="http://zvon.org/uppercase"/>
</BBB>
<x111 xmlns:xnumber="http://zvon.org/xnumber">
<x222 xmlns:xnumber="http://zvon.org/xnumber"/>
</x111>
</aaa>


Пространства имен XML в примерах

Объявление пространств имён для каждого элемента, как в примере 2, может быть не удобно и способствовать возникновению ошибок. Стандарт предлагает несколько путей решения. Пространство имён, назначенное данному элементу, является действительным для всех элементов, находящихся внутри данного.

<aaa xmlns:lower="http://zvon.org/lowercase">
<bbb>
<ccc/>
</bbb>
<BBB xmlns:upper="http://zvon.org/uppercase">
<CCC/>
</BBB>
<x111 xmlns:xnumber="http://zvon.org/xnumber">
<x222/>
</x111>
</aaa>


Пространства имен XML в примерах

Обычно все пространства имён объявляются в корневом элементе.

<aaa xmlns:lower="http://zvon.org/lowercase" xmlns:upper="http://zvon.org/uppercase" xmlns:xnumber="http://zvon.org/xnumber">
<bbb>
<ccc/>
</bbb>
<BBB>
<CCC/>
</BBB>
<x111>
<x222/>
</x111>
</aaa>


Пространства имен XML в примерах

Пространство имен идентифицируется значением атрибута xmlns, а не префиксом. В данном примере все элементы принадлежат к одному пространству имён, однако имеют различные префиксы.

<aaa xmlns:lower="http://zvon.org/lowercase" xmlns:upper="http://zvon.org/lowercase" xmlns:xnumber="http://zvon.org/lowercase">
<bbb>
<ccc/>
</bbb>
<BBB>
<CCC/>
</BBB>
<x111>
<x222/>
</x111>
</aaa>


Пространства имен XML в примерах

В то время как в примере 5 все элементы принадлежат к одному и тому же пространству имён, имея разные префиксы, в данном случае они принадлежат к разным пространствам имён, хотя имеют одинаковые префиксы.

<aaa>
<bbb xmlns:lower="http://zvon.org/lowercase">
<ccc/>
</bbb>
<BBB xmlns:lower="http://zvon.org/uppercase">
<CCC/>
</BBB>
<x111 xmlns:lower="http://zvon.org/xnumber">
<x222/>
</x111>
</aaa>


Пространства имен XML в примерах

Пространства имён не обязательно должны объявляться с префиксами. Атрибут xmlns задаёт пространство имён по умолчанию, которое будет использоваться для элемента, в котором он встречается, а также для дочерних элементов.

<aaa>
<bbb xmlns="http://zvon.org/lowercase">
<ccc/>
</bbb>
<BBB xmlns="http://zvon.org/uppercase">
<CCC/>
</BBB>
<x111 xmlns="http://zvon.org/xnumber">
<x222/>
</x111>
</aaa>


Пространства имен XML в примерах

Даже если задано пространство имён по умолчанию, пространства имён для каждого отдельного элемента может быть задано явно.

<aaa xmlns:upper="http://zvon.org/uppercase" xmlns:xnumber="http://zvon.org/xnumber">
<bbb xmlns="http://zvon.org/lowercase">
<ccc/>
<WWW/>
<x666/>
</bbb>
<BBB xmlns="http://zvon.org/uppercase">
<WWW/>
<x666/>
<CCC/>
</BBB>
<x111 xmlns="http://zvon.org/xnumber">
<x222/>
<WWW/>
<x666/>
</x111>
</aaa>


Пространства имен XML в примерах

Пространства имён по умолчанию могут быть отменены использованием пустой строки в качестве значения атрибута xmlns.

<aaa xmlns="http://zvon.org/lowercase">
<bbb>
<ccc xmlns="">
<ddd/>
</ccc>
</bbb>
</aaa>


Пространства имен XML в примерах

Атрибуты тоже могут быть явно отнесены к заданному пространству имён.

<aaa xmlns:lower="http://zvon.org/lowercase" xmlns:upper="http://zvon.org/uppercase" xmlns:xnumber="http://zvon.org/xnumber">
<bbb zz="11">
<ccc WW="22"/>
</bbb>
<BBB sss="***" S111="???"/>
<x111/>
</aaa>


Пространства имен XML в примерах

Атрибуты без префикса никогда не принадлежат ни к какому пространству имён.

<aaa xmlns:lower="http://zvon.org/lowercase" xmlns:upper="http://zvon.org/uppercase" xmlns:xnumber="http://zvon.org/xnumber">
<bbb zz="11">
<ccc WW="22"/>
</bbb>
<BBB sss="***" S111="???"/>
<x111/>
</aaa>


Пространства имен XML в примерах

Атрибуты не принадлежат ни к какому пространству имён, даже если пространство имён по умолчанию задано для элемента, к которому принадлежит атрибут.

<aaa xmlns="http://zvon.org/lowercase" xmlns:upper="http://zvon.org/uppercase" xmlns:xnumber="http://zvon.org/xnumber">
<bbb zz="11">
<ccc WW="22" xmlns="http://zvon.org/uppercase"/>
</bbb>
<BBB sss="***" S111="???"/>
<x111/>
</aaa>


Пространства имен XML в примерах

Объявление пространства имён действует в рамках элемента, в котором оно встречается.

<aaa xmlns:lower="http://zvon.org/lowercase">
<BBB xmlns:lower="http://zvon.org/uppercase">
<x111/>
<sss xmlns:lower="http://zvon.org/xnumber">
<x111/>
</sss>
</BBB>
<x111/>
</aaa>


Пространства имен XML в примерах

И ещё один пример напоследок.

<OOO xmlns="http://zvon.org/xnumber" xmlns:lower="http://zvon.org/lowercase" ooo="222">
<aaa xmlns:lower="http://zvon.org/lowercase">
<BBB xmlns:lower="http://zvon.org/uppercase">
<x111/>
<sss xmlns:lower="http://zvon.org/xnumber">
<x111/>
</sss>
</BBB>
<x111/>
</aaa>
<aaa xmlns="http://zvon.org/uppercase">
<BBB xmlns:upper="http://zvon.org/uppercase" U="A" U="A" U="A"/>
</aaa>
<aaa xmlns="http://zvon.org/lowercase">
<BBB xmlns:upper="http://zvon.org/uppercase" xmlns="http://zvon.org/xnumber">
<x111/>
</BBB>
<x111/>
</aaa>
</OOO>


Пространства имен XML в примерах

Страница 1 | В примерах использованы три искусственных набора элементов: набранные маленькими буквами, большими буквами и x+<число>. Человек легко может распознать, к какому из наборов принадлежит тот или иной элемент. Однако, компьютер не может делать подобных умозрительных заключений, поэтому нужно определить некий логический механизм.
Страница 2 | Для объявления пространств имён используются зарезервированные атрибуты, начинающиеся с xmlns. Вы можете объявить пространство имён для каждого элемента, который вы используете, но такой подход весьма утомителен. Кроме того, получившийся код будет трудно читать.
Страница 3 | Объявление пространств имён для каждого элемента, как в примере 2, может быть не удобно и способствовать возникновению ошибок. Стандарт предлагает несколько путей решения. Пространство имён, назначенное данному элементу, является действительным для всех элементов, находящихся внутри данного.
Страница 4 | Обычно все пространства имён объявляются в корневом элементе.
Страница 5 | Пространство имен идентифицируется значением атрибута xmlns, а не префиксом. В данном примере все элементы принадлежат к одному пространству имён, однако имеют различные префиксы.
Страница 6 | В то время как в примере 5 все элементы принадлежат к одному и тому же пространству имён, имея разные префиксы, в данном случае они принадлежат к разным пространствам имён, хотя имеют одинаковые префиксы.
Страница 7 | Пространства имён не обязательно должны объявляться с префиксами. Атрибут xmlns задаёт пространство имён по умолчанию, которое будет использоваться для элемента, в котором он встречается, а также для дочерних элементов.
Страница 8 | Даже если задано пространство имён по умолчанию, пространства имён для каждого отдельного элемента может быть задано явно.
Страница 9 | Пространства имён по умолчанию могут быть отменены использованием пустой строки в качестве значения атрибута xmlns.
Страница 10 | Атрибуты тоже могут быть явно отнесены к заданному пространству имён.
Страница 11 | Атрибуты без префикса никогда не принадлежат ни к какому пространству имён.
Страница 12 | Атрибуты не принадлежат ни к какому пространству имён, даже если пространство имён по умолчанию задано для элемента, к которому принадлежит атрибут.
Страница 13 | Объявление пространства имён действует в рамках элемента, в котором оно встречается.
Страница 14 | И ещё один пример напоследок.


Школа WSDL

Связи WSDL

Связи WSDL определяют формат сообщения и подробности протокола для каждого порта.

Связь с SOAP

Пример операции запроса-ответа:

<message name="getTermRequest">
   <part name="term" type="xs:string"/>
</message>

<message name="getTermResponse">
   <part name="value" type="xs:string"/>
</message>

<portType name="glossaryTerms">
   <operation name="getTerm">
      <input message="getTermRequest"/>
      <output message="getTermResponse"/>
   </operation>
</portType>

<binding type="glossaryTerms" name="b1">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
  <operation>
    <soap:operation
     soapAction="http://example.com/getTerm"/>
    <input>
      <soap:body use="literal"/>
    </input>
    <output>
      <soap:body use="literal"/>
    </output>
  </operation>
</binding>

Элемент binding имеет два атрибута --- атрибут name и атрибут type.

Атрибут name определяет название (можно использовать любое) связи, а атрибут type --- точку монтирования для связи, в данном случае это порт "golossaryTerms".

Элемент soap:binding имеет два атрибута --- атрибут style и атрибут transport.

Элемент style может быть либо "rpc", либо "document". В данном случае используется значение document. Атрибут transport определяет используемый SOAP протокол. В данном случае это HTTP.

Элемент operation описывает все операции, с которыми порт может работать.

Для каждой операции должно быть определено в соответствие действие SOAP. Также необходимо указать кодировку ввода и вывода. В этом случае используется "literal".


Школа WSDL

Документы WSDL

Документ WSDL - это всего лишь простой документ XML.

Он содержит набор выражений, определяющих web-сервис.

Структура документа WSDL

В документе WSDL определяется web-сервис с помощью следующих основных элементов:

Элемент | Определяет
<portType> | Методы, предоставляемые web-сервисом
<message> | Сообщения, используемые web-сервисом
<types> | Типы данных, используемые web-сервисом
<binding> | Протоколы связи, используемые web-сервисом

Основная структура документа WSDL выглядит следующим образом:

<definitions>

<types>
   определение типов........
</types>

<message>
   определение сообщения....
</message>

<portType>
   определение порта........
</portType>

<binding>
   определение связей.......
</binding>

</definitions>

Документ WSDL может также содержать другие элементы, например элементы расширения и элемент service, который позволяет объединить вместе в одном отдельном документе WSDL определения нескольких web-сервисов.

Полный обзор синтаксиса вы можете найти в разделе Синтаксис WSDL.

Порты WSDL

Элемент <portType> является наиболее важным элементом в WSDL.

Он определяет сам web-сервис, предоставляемые им операции и используемые сообщения.

Элемент <portType> можно сравнить с библиотекой функций (модулем, классом) в традиционном языке программирования.

Сообщения WSDL

Элемент <message> определяет элементы данных операции.

Каждое сообщение может содержать одну или несколько частей. Эти части можно сравнить с параметрами вызываемых функций в традиционном языке программирования.

Типы WSDL

Элемент <types> определяет тип данных, используемых web-сервисом.

Для максимальной платформо-независимости WSDL использует синтаксис XML Schema для определения типов данных.

Связи WSDL

Элемент <binding> определяет формат сообщения и детали протокола для каждого порта.

Пример WSDL

Это простейшая фрагмент WSDL-документа:

<message name="getTermRequest">
   <part name="term" type="xs:string"/>
</message>

<message name="getTermResponse">
   <part name="value" type="xs:string"/>
</message>
<portType name="glossaryTerms">
  <operation name="getTerm">
      <input message="getTermRequest"/>
      <output message="getTermResponse"/>
  </operation>
</portType>

В этом примере элемент portType определяет "glossaryTerms" как имя порта, и "getTerm" как имя опрерации.

Операция "getTerm" имеет входящее сообщение, называемое "getTermRequest", и исходящее сообщение --- "getTermResponse".

Элементы message определяют части каждого сообщения и ассоциированные типы данных.

Если сравнивать с традиционным программированием, то glossaryTerms --- библиотека функций, а "getTerm" --- функция с параметром "getTermRequest", которая возвращает getTermResponse после выполнения.


Школа WSDL

Введение в WSDL
В этом разделе объясняется, что такое WSDL.

Документы WSDL
В этом разделе описываются основные части документа WSDL.

Порты WSDL
Здесь описан интерфейс портов WSDL.

Связи WSDL
В этом разделе описан интерфейс связей WSDL.

WSDL и UDDI
В этим разделе описывается интеграция UDDI (Universal Description Discovery and Integration) с WSDL.

Синтаксис WSDL
Полный синтаксис WSDL в соответствии с Комментарием W3C.

Ресурсы по WSDL
Список ресурсов, посвященных WSDL.


Школа WSDL

Введение в WSDL

WSDL - это XML-ориентированный язык, предназначенный для определения web-сервисов и доступа к ним.

Предварительные Знания

Предполагается, что читатель уже имеет базовые знания по технологиям XML Namespaces и XML Schema.

В противном случае, мы рекомендуем сначала изучить Школу XML, а также Школу Schema.

Что такое WSDL?

  • WSDL расшифровывается как Язык Описания Web-сервисов (Web Services Description Language)
  • WSDL написан на XML
  • WSDL является XML-документом
  • WSDL используется для описания web-сервисов
  • WSDL также используется для определения расположения web-сервисов
  • WSDL не является стандартом W3C

WSDL Описывает Web-сервисы

WSDL расшифровывается как Язык Описания Web-сервисов (Web Services Description Language).

Документ WSDL является XML-документом, описывающим web-сервис. Он определяет расположение сервиса и операции (или методы), предоставляемые им.

WSDL Станет Стандартом W3C

WSDL предлагается такими компаниями, как Ariba, IBM и Microsoft, для описания сервисов в рамках деятельности W3C XML Activity по Протоколам XML.

Результатом этой деятельности стала публикация рабочего документа по WSDL в статусе Комментария W3C. Комментарий предназначен исключительно для обуждения. При этом факт публикации этого Комментария W3C не означает его одобрение Командой W3C или каким-либо членом W3C.

С самим Комментарием вы можете ознакомиться здесь

Планируется, что WSDL может достигнет статуса Рабочего Документа W3C уже к концу 2002 года, а к концу 2003 года может стать официальной Рекомендацией W3C.


Школа WSDL

Порты WSDL

Порты WSDL описывают интерфейс (список допустимых операций) работы с web-сервисом.

Порты WSDL

Элемент <portType> --- самый важный элемент WSDL.

Он определяет web-сервис, выполняемые им операции и допустимые сообщения

Порт определяет точку монтирования к web-сервису. Его можно сравнить с библиотекой функций (модулем, классом) в традиционном языке программирования, а каждую операцию можно сравнить с функцией в традиционном языке программирования.

Типы Операций

Запрос-ответ (request-response) --- самый распространенный тип операций. Всего же в WSDL определено четыре типа:

Тип | Описание
Однонаправленный (One-way) | Операция может принимать сообщение, но не будет возвращать ответ
Запрос-ответ (Request-response) | Операция может принимать запрос и возвратит ответ
Вопрос-ответ (Solicit-response) | Операция может послать запрос и будет ждать ответ
Извещение (Notification) | Операция может послать сообщение, но не будет ожидать ответ

Однонаправленная (One-Way) Операция

Пример однонаправленной операции:

<message name="newTermValues">
   <part name="term" type="xs:string"/>
   <part name="value" type="xs:string"/>
</message>

<portType name="glossaryTerms">
   <operation name="setTerm">
      <input name="newTerm" message="newTermValues"/>
   </operation>
</portType >

В этом примере порт "glossaryTerms" определяет однонаправленную операцию под названием "setTerm".

Операция "SetTerm" позволяет ввод новых словарных термов с помощью сообщения "newTermValues" со входными параметрами "term" и "value". Однако, данная операция не предусматривает какого-либо выходного сообщения.

Операция типа "Запрос-Ответ"

Пример операции типа "запрос-ответ":

<message name="getTermRequest">
   <part name="term" type="xs:string"/>
</message>

<message name="getTermResponse">
   <part name="value" type="xs:string"/>
</message>
<portType name="glossaryTerms">
  <operation name="getTerm">
      <input message="getTermRequest"/>
      <output message="getTermResponse"/>
  </operation>
</portType>

В этом примере порт "glossaryTerms" определяет операцию типа "запрос-ответ" с именем "getTerm".

Операция "getTerm" принимает на вход сообщение с именем "getTermRequest" и параметром "term" и возвращает сообщение с именем "getTermResponse" и параметром "value".


Школа WSDL

Ресурсы по WSDL

Список ресурсов по WSDL

http://radio.weblogs.com/0101679/stories/2002/02/15/
aBusyDevelopersGuideToWsdl11.html

http://xml.coverpages.org/wsdl.html

http://www.learnxmlws.com/tutors/wsdl/wsdl.aspx

http://www.fawcette.com/xmlmag/2001_11/
magazine/columns/collaboration/sramasundaram/

http://msdn.microsoft.com/library/default.asp?
url=/library/en-us/dnwebsrv/html/wsdlexplained.asp

http://general.rau.ac.za/infosci/raujournal/default.asp?to=newsvol3nr1

http://www.byte.com/documents/s=7031/byt1015007393289/0304_udell.html

http://dcb.sun.com/practices/webservices/overviews/overview_wsdl.jsp

Ссылки по WSDL:

http://www.zvon.org/xxl/WSDL1.1/Output/

WSDL-броузеры:

http://www.gotdotnet.com/Services/WsdlBrowser/default.asp


Школа WSDL

Синтаксис WSDL

Ниже приведен листинг полного синтаксиса WSDL в соответствии с Комментарием W3C.

<wsdl:definitions name="nmtoken"? targetNamespace="uri"?>

    <import namespace="uri" location="uri"/>*

    <wsdl:documentation .... /> ?

    <wsdl:types> ?
        <wsdl:documentation .... />?
        <xsd:schema .... />*
        <-- extensibility element --> *
    </wsdl:types>

    <wsdl:message name="nmtoken"> *
        <wsdl:documentation .... />?
        <part name="nmtoken" element="qname"? type="qname"?/> *
    </wsdl:message>

    <wsdl:portType name="nmtoken">*
        <wsdl:documentation .... />?
        <wsdl:operation name="nmtoken">*
           <wsdl:documentation .... /> ?
           <wsdl:input name="nmtoken"? message="qname">?
               <wsdl:documentation .... /> ?
           </wsdl:input>
           <wsdl:output name="nmtoken"? message="qname">?
               <wsdl:documentation .... /> ?
           </wsdl:output>
           <wsdl:fault name="nmtoken" message="qname"> *
               <wsdl:documentation .... /> ?
           </wsdl:fault>
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding name="nmtoken" type="qname">*
        <wsdl:documentation .... />?
        <-- extensibility element --> *
        <wsdl:operation name="nmtoken">*
           <wsdl:documentation .... /> ?
           <-- extensibility element --> *
           <wsdl:input> ?
               <wsdl:documentation .... /> ?
               <-- extensibility element -->
           </wsdl:input>
           <wsdl:output> ?
               <wsdl:documentation .... /> ?
               <-- extensibility element --> *
           </wsdl:output>
           <wsdl:fault name="nmtoken"> *
               <wsdl:documentation .... /> ?
               <-- extensibility element --> *
           </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>

    <wsdl:service name="nmtoken"> *
        <wsdl:documentation .... />?
        <wsdl:port name="nmtoken" binding="qname"> *
           <wsdl:documentation .... /> ?
           <-- extensibility element -->
        </wsdl:port>
        <-- extensibility element -->
    </wsdl:service>

    <-- extensibility element --> *

</wsdl:definitions>


Школа WSDL

WSDL и UDDI

Универсальное Описание, Поиск и Взаимодействие (UDDI) --- сервис, предназначенный для регистрации и поиска web-сервисов предпринимателями.

Что Такое UDDI?

UDDI --- платформонезависимая структура описания, поиска и интегрирования бизнес-сервисов в Internet.

  • UDDI --- это Универсальное Описание, Поиск и Взаимодействие
  • UDDI предназначен для хранения информации о web-сервисе
  • В UDDI интерфейс web-сервиса описывается с помощью WSDL
  • UDDI имеет связь с SOAP
  • UDDI встроен в платформу Microsoft .NET

Что лежит в основе UDDI?

UDDI использует Internet стандарты W3C (World Wide Web Consortium) и IETF (Internet Engineering Task Force), такие как XML, HTTP и DNS протоколы.

UDDI использует WSDL для описания интерфейсов web-сервисов.

В частности, пересечение этих платформ описания для SOAP, соответствует спецификации сообщений XML Protocol, которая может быть найдена на сайте W3C.

Выгодность Использования UDDI

Предпринимательская деятельность любых объемов может извлекать выгоду из UDDI

До UDDI в Internet не существовало какого-либо стандарта для поиска заказчиков или партнеров с информацией о предоставляемых изделиях или сервисах Не было систем интеграций систем и процессов друг в друга.

Проблемы, которые способна решить спецификация UDDI:

  • Становится возможным обнаружить нужного предпринимателя из миллионов уже находящихся в сети
  • Определение способов сотрудничества с найденным предприниматилем
  • Поиск новых заказчиков и упрощение доступа к уже существующим
  • Расширение предложений и увеличение рыночной досягаемости
  • Решение проблемы возникающих барьеров при участии в глобальной экономике Internet
  • Описание сервисов и деловых процессов программно в единой, открытой и преспективной среде

Как использовать UDDI?

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

Кто Поддерживает UDDI?

UDDI используется при создании различных платформ и програмных продуктов, таких фирм как Dell, Fujitsu, HP, Hitachi, IBM, Intel, Microsoft, Oracle, SAP и Sun. Он также с успехом используется операторами рынка и e-busness лидерами.

UDDI использует более чем 220 компаний.


Школа XPath

Примеры XPath

Мы используем каталог CD из нашей Школы XML для демонстрации некоторых примеров XPath.

Каталог CD

Если вы читали нашу Школу XML, вы наверняка помните следующий XML-документ:

(Фрагмент каталога CD)

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
  <cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <country>UK</country>
    <company>CBS Records</company>
    <price>9.90</price>
    <year>1988</year>
  </cd>
.
.
.
.
</catalog>

Если вы используете IE 5 или выше, вы можете открыть cdcatalog здесь.

Извлечение Узлов

XPath может использоваться для определения узлов, которые должны быть выбраны или извлечены из XML-файла.

Мы можем продемонстрировать эту возможность с помощью функции selectNodes в Internet Explorer. Эта функция получает выражение для пути адресации в качестве аргумента:

syntax:
xmlobject.selectNodes(XPath expression)
example:
xmlDoc.selectNodes("/catalog/cd/price")

Извлечение Узла <cd>

В следующем примере из каталога CD извлекаются все узлы <cd>:

xmlDoc.selectNodes("/catalog/cd")

Если вы используете Internet Explorer, вы можете посмотреть на результат здесь.

Извлечение Первого Узла <cd>

В следующем примере из каталога CD извлекается только первый узел <cd>:

xmlDoc.selectNodes("/catalog/cd[0]")

Если вы используете Internet Explorer, вы можете посмотреть на результат здесь.

Извлечение Узлов <price>

В следующем примере из каталога CD извлекаются все узлы <price>:

xmlDoc.selectNodes("/catalog/cd/price")

Если вы используете Internet Explorer, вы можете посмотреть на результат здесь.

Извлечение Текстовых Узлов <price>

В следующем примере извлекается только текст из узлов <price>:

xmlDoc.selectNodes("/catalog/cd/price/text()")

Если вы используете Internet Explorer, вы можете посмотреть на результат здесь.

Извлечение Узлов <cd> со Значением Price>10.80

В следующем примере извлекаются все узлы <cd> nodes со значением price >10.80:

xmlDoc.selectNodes("/catalog/cd[price>10.80]")

Если вы используете Internet Explorer, вы можете посмотреть на результат здесь


Школа XPath

Выражения XPath

XPath поддерживает числовые выражения, операции равенства и сравнения, а также булевы выражения.

Числовые Выражения

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

Оператор | Описание | Пример | Результат
+ | Сложение | 6 + 4 | 10
- | Вычитание | 6 - 4 | 2
* | Умножение | 6 * 4 | 24
div | Деление | 8 div 4 | 2
mod | Остаток от деления | 5 mod 2 | 1

Замечание: XPath всегда преобразует аргумент в число перед выполнением арифметических операций.

Операции равенства

Операции равенства используются для проверки равенства двух значений.

Оператор | Описание | Пример | Результат
= | Равно | price=9.80 | 'истина' (если значение price равно 9.80)
!= | Не равно | price!=9.80 | 'ложь'

Проверка по Множеству Узлов

В случае, когда тестовое значение проверяется на равенство по множеству узлов, результатом будет 'истина', если множество узлов содержит какой-либо узел со значением, которое соответствует тестовому значению.

Когда тестовое значение проверяется на неравенство по множеству узлов, результатом будет 'истина', если множество узлов содержит хотя бы один узел со значением, отличным от тестового.

В итоге множество узлов может быть равно и не равно одновременно!!!

Операции Сравнения

Эти операции используются для сравнения двух значений.

Оператор | Описание | Пример | Результат
< | Меньше | price<9.80 | 'ложь' (если price равно 9.80)
<= | Меньше или равно | price<=9.80 | 'истина'
> | Больше | price>9.80 | 'ложь'
>= | Меньше или равно | price>=9.80 | 'истина'

Замечание: XPath всегда преобразует каждый аргумент в число перед выполнением сравнения.

Булевы Выражения

Оператор | Описание | Пример | Результат
or | или | price=9.80 or price=9.70 | 'истина' (если price равно 9.80)
and | и | price<=9.80 and price=9.70 | 'ложь'


Школа XPath

Функции XPath

XPath содержит библиотеку встроенных функций для преобразования данных.

Библиотека Функций XPath

Библиотека функций XPath включает набор базовых функций для преобразования данных.

Числовые Функции

Имя | Описание | Пример | Результат
round | Округляет до ближайшего целого. | round(3.14) | 3
ceiling | Округляет до ближайшего целого, которое больше данного. | ceiling(3.14) | 4
floor | Округляет до ближайшего целого, которое меньше данного. | floor(3.14) | 3
count | Возвращает количество узлов. | count(nodeset) | количество узлов в множестве узлов
number | Преобразует аргумент в число. | number(price) | Численное значение элемента price
sum | Возвращает сумму списка чисел. | sum(/cd/price) | Суммарная цена всех CD

Строковые Функции

Имя | Описание | Пример | Результат
string | Преобразует аргумент в строку. | string(3.14) | '3,14'
string-length | Возвращает длину строки. | string-lenght('Beatles') | 7
substring | Возвращает подстроку. | substring('Beatles',1,4) | 'Beat'
substring-after | Возвращает остаток строки после второго аргумента. | substring-after('12:30',':') | '30'
substring-before | Возвращает часть строки перед вторым аргументом. | substring-before('12:30',':') | '12'
contains | Возвращает 'истину', если первая строка содержит вторую. | contains('XML','X') | 'истина'
starts-with | Возвращает 'истину', если первая строка начинается второй. | starts-with('XML','X') | 'истина'
concat | Возвращает конкатенацию двух строк. | concat('The',' ','Beatles') | 'The Beatles'
normalize-space | Удаляет лишние пробелы в строке. | normalize-space(' The Beatles') | 'The Beatles'
translate | Заменяет символы в строке. | translate('12:30',':','.') | '12.30'

Булевы Функции

Имя | Описание | Пример | Результат
boolean | Преобразует аргумент к булевому типу. | boolean(3.14) | 'истина', если price не равен нулю
false | Вовращает 'ложь'. | number(false()) | 0
true | Возвращает 'истину'. | number(true()) | 1
not | Возвращает отрицание. | not(false()) | 'истина'


Школа XPath

XPath - это набор синтаксических правил для адресации частей XML-документа.

XPath является важнейшей частью стандарта W3C XSLT. Без знания XPath вы не сможете создавать XSLT-документы.

Содержание

Введение в XPath
В этом разделе объясняется, что такое XPath и как его можно использовать.

Пути адресации XPath
В этом разделе объясняется, как используются выражения адресации XPath для определения местоположения узлов в XML-документах.

Выражения XPath
В этом разделе описаны распространенные XPath-выражения.

Функции XPath
В этом разделе описаны основные функции XPath.

Примеры XPath
В этим разделе на основе XML-документа для каталога CD приведены несколько примеров использования XPath.


Школа XPath

Введение в XPath

XPath - это набор синтаксических правил для адресации частей XML-документа.

Что такое XPath?

  • XPath - это синтаксис для адресации частей XML-документа
  • XPath использует пути для адресации элементов XML
  • XPath является важнейшей частью стандарта XSLT
  • XPath не является XML-форматом
  • XPath является стандартом W3C

Обычные адреса для файлов

XPath использует адресные выражения для идентификации узлов в XML-документе. Эти адресные выражения очень похожи на выражения, с которыми вы сталкиваетесь при работе с файловой системой компьютера:

w3schools/xpath/default.asp

inetpub/www/myweb

Пример XPath

Если вы читали нашу Школу XML, вы наверняка помните следующий XML-документ:

(Фрагмент каталога CD)

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
  <cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <country>UK</country>
    <company>CBS Records</company>
    <price>9.90</price>
    <year>1988</year>
  </cd>
.
.
.
.
</catalog>

Это выражение XPath:

catalog/cd/price

определяет элементы price, дочерние относительно элементов cd, подэлементов элемента catalog

XPath используется в XSLT

XPath является важнейшей частью стандарта XSLT.

Без знания XPath вы не сможете создавать документы XSLT.

Вы можете узнать больше о XSLT в нашей Школе XSLT.

XPath является стандартом W3C

XPATH был выпущен в статусе "W3C Recommendation" 16 ноября 1999 года, как язык для адресации частей XML-документа.

XPath был разработан для использования в XSLT, XPointer, а также другими приложениями для анализа XML.

Вы можете узнать больше о стандартах XML и XSL в нашей Школе W3C.


Школа XPath

Пути адресации XPath

XPath - это набор синтаксических правил для адресации частей XML-документа.

Выражения для Путей Адресации

Имя | Описание | Пример | Результат
/ | Дочерний элемент узла | /price | элемент price
// | Узел и его дочерние элементы | //cd | элемент cd и его подэлементы
| | список дочерних элементов | price | title | элемент price и title

Оси

Оси служат для определения набора узлов относительно данного узла.

Имя | Описание | Узел
self | сам узел |
child | Дочерние узлы |
parent | Родительский узел |
descendant | Потомки узла |
descendant-or-self | Узел и его потомки |
ancestor | Предки узла |
ancestor-or-self | Сам узел и его предки |
following | Все узлы после данного |
following-sibling | Все узлы этого же уровня после данного |
preceding | Все узлы перед данным |
preceding-sibling | Все узлы этого же уровня перед данным |
attribute | Узлы аттрибутов |
namespace | Узлы пространства имен |

Предикаты Путей Адресации

Предикаты - это выражения, использующиеся для построения конкретных подмножеств узлов на основе данного.

Предикаты записываются внутри квадратных скобок.

Например, child::price[price=9.90] возвращает множество узлов, где элемент price имеет значение 9.90.

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

Сокращения для Путей Адресации

При описании путей адресации могут использоваться сокращения.

Сокращение | Значение
 | child::
@ | attribute::
. | self::
.. | parent::
// | /descendant-or-self/
число | [position()='значение']


XML в примерах

Описание

XML документ должен содержать один или более элементов.

Правильно сформированные документы

Документ с одним элементом:

<text>This is an XML document</text>

Документ с несколькими элементами:

<text>This is an
<doctype>XML document</doctype>
</text>

Документы с ошибками

XML документ должен содержать, как минимум, один элемент:

??? This is an XML document ???


XML в примерах

Описание

Существует ровно один элемент, называемый корневым или документным, ни какая часть которого не входит в содержимое любого другого элемента.

Правильно сформированные документы

<book> является корневым:

<book>This is a book</book>

<list> является корневым:

<list>
<item>Item 1</item>
<item>Item 2</item>
<item>Item 3</item>
</list>

Документы с ошибками

В документе может быть только один корневой элемент:

???
<item>Item 1</item>
<item>Item 2</item>
<item>Item 3</item>
???


XML в примерах

Описание

Имя закрывающего тега элемента должно совпадать с типом элемента в открывающем теге. Имена чувствительны к регистру.

Правильно сформированные документы

Закрывающий тег </book> соответствует открывающему <book>:

<book>This is a book</book>

Правильно сформированный документ, содержащий 4 различных элемента <list>, <item>, <ITEM> и <Item>:

<list>
<item>Car</item>
<ITEM>Plane</ITEM>
<Item>Train</Item>
</list>

Документы с ошибками

<item> - </itm> и <item> - </ITEM> не сопоставимы:

<list>
<item>Car</itm>
<item>Plane</ITEM>
<item>Train</item>
</list>


XML в примерах

Описание

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

Правильно сформированные документы

Элементы с правильной вложенностью:

<Weight>
<number>12</number>
<unit>grams</unit>
</Weight>

Другой правильно сформированный документ:

<book>
<chapter>
<title>Introduction</title>
</chapter>
<chapter>
<title>Story</title>
<subChapter>
<title>Part 1</title>
</subChapter>
<subChapter>
<title>Part 2</title>
</subChapter>
</chapter>
<chapter>
<title>Index</title>
</chapter>
</book>

Документы с ошибками

Элемент <italic> не является правильно вложенным:

<text>
<bold><italic>XML</bold></italic>
</text>


XML в примерах

Описание

Конец любого элемента, начинающегося открывающим тегом, должен быть определен закрывающим тегом, имя которого совпадает с типом элемента, указанного в открывающем теге. Текст между открывающим и закрывающим тегами называется содержимым элемента. Элемент без содержимого может быть записан в специальной форме: <name/>. Косая черта ("/") перед > обуславливает закрывающий тег.

Правильно сформированные документы

Каждый элемент должен иметь закрывающий тег или должен быть представлен в специальной форме. В XML нет разницы между конструкциями <AAA></AAA> и <AAA/>:

<listOfTags>
<AAA></AAA>
<BBB></BBB>
<CCC/>
<DDD/>
</listOfTags>

Документы с ошибками

Пропуск косой черты ("/") является очень распространенной ошибкой:

<description>
There are <color>yellow<color> and <color>red</color> apples.
</description>


XML в примерах

Описание

Имена элементов могут содержать буквы, цифры, дефисы ("-"), символы подчеркивания ("_"), двоеточия (":") и точки (".'), однако начинаться они могут только с буквы или символа подчеркивания. Двоеточие может быть использовано только в специальных случаях, когда оно разделяет так называемое пространство имен. Имена элементов, начинающиеся с 'xml', вне зависимости от комбинации регистров букв в этом выражении зарезервированы для нужд стандарта.

Правильно сформированные документы

Документ с разрешенными символами:

<permitedNames>
<name/>
<xsl:copy-of/>
<A_long_element_name/>
<A.name.separated.with.full.stops/>
<a123323123-231-231/>
<_12/>
</permitedNames>

Документы с ошибками

Этот документ содержит несколько ошибок:

<forbidenNames>
<A;name/>
<last@name/>
<@#$%^()%+?=/>
<A*2/>
<1ex/>
</forbidenNames>

Имена не могут начинаться с 'xml':

<forbidenNames>
<xmlTag/>
<XMLTag/>
<XmLTag/>
<xMlTag/>
<xmLTag/>
</forbidenNames>


XML в примерах

Описание

Элемент может иметь ни одного, один или несколько атрибутов. Правила на имена атрибутов накладываются такие же как и на имена элементов. Имена атрибутов отделяются от их значений знаком '='. Значение атрибута заключается в апострофы '...' или в двойные кавычки "...". Если апостроф или двойные кавычки присутствуют в значении атрибута, то используются те из них, которые не встречаются в этом значении.

Правильно сформированные документы

Документ с правильно оформленными атрибутами:

<elements-with-attributes>
<el _ok = "yes" />
<one attr = "a value"/>
<several first="1" second = '2' third= "333"/>
<apos_quote case1="John's" case2='He said: "Hello, world!" '/>
</elements-with-attributes>

Документы с ошибками

Документ с ошибочными атрибутами:

<errors>
<wrong_char a*b = "23432"/>
<mismatched_separator value = "12'/>
<wrong_separator_type value="aa"aa"/>
<wrong_separator_type value='bb'bb'/>
<wrong_start XML-ID = "xml234"/>
</errors>


XML в примерах

Описание

Символы < и & не могут быть использованы в тексте, так как они используются в разметке. Если эти символы необходимы, следует использовать &lt; вместо < и &amp; вместо &.

Правильно сформированные документы

Замещение & и <:

<example>
<isLower>
23 &lt; 46
</isLower>
<ampersand>
Willey &amp; sons
</ampersand>
</example>

Документы с ошибками

Символы & и < не могут быть использованы в тексте:

<example>
<isLower>
23 < 46
</isLower>
<ampersand>
Willey & sons
</ampersand>
</example>


XML в примерах

Описание

Символы >, ", и ' также могут быть заменены на &gt;, &quot; и &apos;, соответственно.

Правильно сформированные документы

Возможные подстановки:

<example>
<right-bracket> both > and &gt; permitted</right-bracket>
<double-quote> both " and &quot; permitted</double-quote>
<apostrophe> both ' and &apos; permitted</apostrophe>
Useful in: <el value=" &apos; &quot; &apos; "/>
</example>


XML в примерах

Описание

Комментарии могут содержаться в любом месте документа, кроме разметки. XML-процессор может, но не обязан, предоставлять приложениям доступ к содержимому комментариев. В тексте комментарием не должна содержаться последовательность из двух знаков дефиса ('--').

Правильно сформированные документы

Коментарии могут содержать любые символы, кроме строки '--':

<!-- doc A -->
<example>
<!-- <HEAD> -->
<!-- Characters <&< -->
</example>

Документы с ошибками

Коментарии не должны содержать '--':

<example>
<!-- A -- B -->
</example>


XML в примерах

Описание

Документ может содержать инструкции по обработке (PI), несущие информацию для приложений.

Правильно сформированные документы

Инструкции по обработке:

<example>
<?perl lower-to-upper-case ?>
<?web-server add-header = "university" ?>
<text>vscht</text>
</example>

Документы с ошибками

Инструкции к обработке должны заканчиваться последовательностью ?>:

<example>
<?perl run _>
</example>


XML в примерах

Описание

Секция CDATA используется для того, чтобы обозначить части документа, которые не должны восприниматься как разметка. Секция CDATA начинается со строки '<![CDATA[' и заканчивается строкой ']]>'. Внутри самой секции не должна присутствовать строка ']]>'.

Правильно сформированные документы

Секция CDATA:

<example>
<![CDATA[ <aaa>bb&cc<<<]]>
</example>

Документы с ошибками

Секция CDATA не может содержать последовательность ']]>':

<example>
<![CDATA[ <aaa>bb ]]>cc<<<]]>
</example>


XML в примерах

Описание

XML-документ может, но не обязан, начинаться с XML-декларации, определяющей используемую версию XML.

Правильно сформированные документы

Определение версии XML:

<?xml version="1.0"?>
<text>This document conforms to the XML 1.0 specification.</text>

Определение используемой кодировки:

<?xml version="1.0" encoding="ISO-8859-2"?>
<text>If encoding is not given UTF-8 is assumed</text>


XML в примерах

Страница 1 | XML документ должен содержать один или более элементов.
Страница 2 | Существует ровно один элемент, называемый корневым или документным, ни какая часть которого не входит в содержимое любого другого элемента.
Страница 3 | Имя закрывающего тега элемента должно совпадать с типом элемента в открывающем теге. Имена чувствительны к регистру.
Страница 4 | Если открывающий тег содержится внутри какого-либо элемента, то и закрывающий должен содержаться в том же элементе. Проще говоря, элементы, задаваемые открывающим и закрывающим тегами, должны быть правильно вложены друг в друга.
Страница 5 | Конец любого элемента, начинающегося открывающим тегом, должен быть определен закрывающим тегом, имя которого совпадает с типом элемента, указанного в открывающем теге. Текст между открывающим и закрывающим тегами называется содержимым элемента. Элемент без содержимого может быть записан в специальной форме: <name/>. Косая черта ("/") перед > обуславливает закрывающий тег.
Страница 6 | Имена элементов могут содержать буквы, цифры, дефисы ("-"), символы подчеркивания ("_"), двоеточия (":") и точки (".'), однако начинаться они могут только с буквы или символа подчеркивания. Двоеточие может быть использовано только в специальных случаях, когда оно разделяет так называемое пространство имен. Имена элементов, начинающиеся с 'xml', вне зависимости от комбинации регистров букв в этом выражении зарезервированы для нужд стандарта.
Страница 7 | Элемент может иметь ни одного, один или несколько атрибутов. Правила на имена атрибутов накладываются такие же как и на имена элементов. Имена атрибутов отделяются от их значений знаком '='. Значение атрибута заключается в апострофы '...' или в двойные кавычки "...". Если апостроф или двойные кавычки присутствуют в значении атрибута, то используются те из них, которые не встречаются в этом значении.
Страница 8 | Символы < и & не могут быть использованы в тексте, так как они используются в разметке. Если эти символы необходимы, следует использовать &lt; вместо < и &amp; вместо &.
Страница 9 | Символы >, ", и ' также могут быть заменены на &gt;, &quot; и &apos;, соответственно.
Страница 10 | Комментарии могут содержаться в любом месте документа, кроме разметки. XML-процессор может, но не обязан, предоставлять приложениям доступ к содержимому комментариев. В тексте комментарием не должна содержаться последовательность из двух знаков дефиса ('--').
Страница 11 | Документ может содержать инструкции по обработке (PI), несущие информацию для приложений.
Страница 12 | Секция CDATA используется для того, чтобы обозначить части документа, которые не должны восприниматься как разметка. Секция CDATA начинается со строки '<![CDATA[' и заканчивается строкой ']]>'. Внутри самой секции не должна присутствовать строка ']]>'.
Страница 13 | XML-документ может, но не обязан, начинаться с XML-декларации, определяющей используемую версию XML.


XPath в примерах

Базовый синтаксис языка XPath похож на адресацию в файловой системе. Если путь начинается с символа '/', то он представляет абсолютный путь к заданному элементу.

/AAA
<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC/>
</AAA>
Выбирается корневой узел AAA

/AAA/CCC
<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC/>
</AAA>
Выбираются все элементы CCC, являющиеся дочерними по отношению к корневому узлу AAA

/AAA/DDD/BBB
<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC/>
</AAA>
Выбираются все элементы BBB, являющиеся детьми элементов DDD, которые в свою очередь являются детьми корневого узла AAA


XPath в примерах

Если путь начинается с //, то будут выбраны все элементы документа, которые соответствуют указанному шаблону.

//BBB
<AAA>
<BBB/>
<CCC/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC>
<DDD>
<BBB/>
<BBB/>
</DDD>
</CCC>
</AAA>
Будут выбраны все элементы BBB

//DDD/BBB
<AAA>
<BBB/>
<CCC/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC>
<DDD>
<BBB/>
<BBB/>
</DDD>
</CCC>
</AAA>
Будут выбраны все элементы BBB, являющиеся детьми DDD


XPath в примерах

Символ '*' указывает, что надо выбрать все элементы, соответствующие пути перед ней.

//*
<AAA>
<XXX>
<DDD>
<BBB/>
<BBB/>
<EEE/>
<FFF/>
</DDD>
</XXX>
<CCC>
<DDD>
<BBB/>
<BBB/>
<EEE/>
<FFF/>
</DDD>
</CCC>
<CCC>
<BBB>
<BBB>
<BBB/>
</BBB>
</BBB>
</CCC>
</AAA>
Будут выбраны все элементы


XPath в примерах

Выражение в квадратных скобках позволяет задавать более четкие критерии для элемента. Так число в квадратных скобках обозначает позицию элемента в выбранном множестве. Функция last() позволяет указать последний элемент в выборке.

/AAA/BBB[1]
<AAA>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
</AAA>
Будет выбран первый потомок BBB элемента AAA

/AAA/BBB[last()]
<AAA>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
</AAA>
Будет выбран последний потомок BBB элемента AAA


XPath в примерах

Атрибуты определяются префиксом @.

//BBB[@id]
<AAA>
<BBB id="b1"/>
<BBB id="b2"/>
<BBB name="bbb"/>
<BBB/>
</AAA>
Выбираются элементы BBB, имеющие атрибут id

//BBB[@name]
<AAA>
<BBB id="b1"/>
<BBB id="b2"/>
<BBB name="bbb"/>
<BBB/>
</AAA>
Выбираются элементы BBB, имеющие атрибут name

//BBB[@*]
<AAA>
<BBB id="b1"/>
<BBB id="b2"/>
<BBB name="bbb"/>
<BBB/>
</AAA>
Выбираются элементы BBB, имеющие хоть какой-нибудь атрибут

//BBB[not(@*)]
<AAA>
<BBB id="b1"/>
<BBB id="b2"/>
<BBB name="bbb"/>
<BBB/>
</AAA>
Выбираются элементы BBB, не имеющие ни одного атрибута


XPath в примерах

Значения атрибутов могут служить критерием при выборке. Функция normalize-space() удаляет пробелы в начале и конце параметра, а все последовательности пробельных символов заменяет одиночным пробелом.

//BBB[@id='b1']
<AAA>
<BBB id="b1"/>
<BBB name=" bbb "/>
<BBB name="bbb"/>
</AAA>
Выбираются элементы BBB, имеющие атрибут id со значением b1

//BBB[@name='bbb']
<AAA>
<BBB id="b1"/>
<BBB name=" bbb "/>
<BBB name="bbb"/>
</AAA>
Выбираются элементы BBB, имеющие атрибут name со значением 'bbb'

//BBB[normalize-space(@name)='bbb']
<AAA>
<BBB id="b1"/>
<BBB name=" bbb "/>
<BBB name="bbb"/>
</AAA>
Выбираются элементы BBB, имеющие атрибут name со значением, которое после нормализации будет идентично bbb


XPath в примерах

Функция count() возвращает число элементов в указанном множестве.

//*[count(BBB)=2]
<AAA>
<CCC>
<BBB/>
<BBB/>
<BBB/>
</CCC>
<DDD>
<BBB/>
<BBB/>
</DDD>
<EEE>
<CCC/>
<DDD/>
</EEE>
</AAA>
Выбираются элементы, имеющие два дочерних элемента BBB

//*[count(*)=2]
<AAA>
<CCC>
<BBB/>
<BBB/>
<BBB/>
</CCC>
<DDD>
<BBB/>
<BBB/>
</DDD>
<EEE>
<CCC/>
<DDD/>
</EEE>
</AAA>
Выбираются элементы, имеющие два произвольных дочерних элемента

//*[count(*)=3]
<AAA>
<CCC>
<BBB/>
<BBB/>
<BBB/>
</CCC>
<DDD>
<BBB/>
<BBB/>
</DDD>
<EEE>
<CCC/>
<DDD/>
</EEE>
</AAA>
Выбираются элементы, имеющие три произвольных дочерних элемента


XPath в примерах

Функция name() возвращает имя элемента. Функция starts-with() возвращает истину, если строка первого аргумента начинается строкой второго аргумента. Функция contains() возвращает истину, если строка из первого аргумента содержит строку из второго.

//*[name()='BBB']
<AAA>
<BCC>
<BBB/>
<BBB/>
<BBB/>
</BCC>
<DDB>
<BBB/>
<BBB/>
</DDB>
<BEC>
<CCC/>
<DBD/>
</BEC>
</AAA>
Выбираются все элементы с именем BBB; эквивалентно пути //BBB

//*[starts-with(name(),'B')]
<AAA>
<BCC>
<BBB/>
<BBB/>
<BBB/>
</BCC>
<DDB>
<BBB/>
<BBB/>
</DDB>
<BEC>
<CCC/>
<DBD/>
</BEC>
</AAA>
Выбираются все элементы, имя которых начинается с B

//*[contains(name(),'C')]
<AAA>
<BCC>
<BBB/>
<BBB/>
<BBB/>
</BCC>
<DDB>
<BBB/>
<BBB/>
</DDB>
<BEC>
<CCC/>
<DBD/>
</BEC>
</AAA>
Выбираются все элементы, имя которых содержит C


XPath в примерах

Функция string-length() возвращает число символов в строке. Следует использовать &lt; вместо <, так как символ '<' зарезервирован для нужд разметки.

//*[string-length(name()) = 3]
<AAA>
<Q/>
<SSSS/>
<BB/>
<CCC/>
<DDDDDDDD/>
<EEEE/>
</AAA>
Выбираются все элементы, имя которых состоит из трех символов

//*[string-length(name()) > 3]
<AAA>
<Q/>
<SSSS/>
<BB/>
<CCC/>
<DDDDDDDD/>
<EEEE/>
</AAA>
Выбираются все элементы, имя которых состоит более чем из трех символов


XPath в примерах

Несколько путей можно скомбинировать с помощью разделителя |.

//CCC | //BBB
<AAA>
<BBB/>
<CCC/>
<DDD>
<CCC/>
</DDD>
<EEE/>
</AAA>
Выбираются все элементы CCC и BBB

/AAA/EEE | //BBB
<AAA>
<BBB/>
<CCC/>
<DDD>
<CCC/>
</DDD>
<EEE/>
</AAA>
Выбираются все элементы BBB и все элементы EEE, чьим прямым родителем является корневой элемент AAA

/AAA/EEE | //DDD/CCC | /AAA | //BBB
<AAA>
<BBB/>
<CCC/>
<DDD>
<CCC/>
</DDD>
<EEE/>
</AAA>
Количество комбинаций не ограничено


XPath в примерах

Ось child содержит дочерние элементы контекстного узла. Ось child является осью, применяемой по умолчанию, и может быть опущена.

/AAA
<AAA>
<BBB/>
<CCC/>
</AAA>
Эквивалентно выражению /child::AAA

/child::AAA
<AAA>
<BBB/>
<CCC/>
</AAA>
Эквивалентно выражению /AAA

/AAA/BBB
<AAA>
<BBB/>
<CCC/>
</AAA>
Эквивалентно /child::AAA/child::BBB

/child::AAA/child::BBB
<AAA>
<BBB/>
<CCC/>
</AAA>
Эквивалентно /AAA/BBB

/child::AAA/BBB
<AAA>
<BBB/>
<CCC/>
</AAA>
Оба варианта можно использовать одновременно


XPath в примерах

Ось descendant содержит потомков контекстного узла; потомком является дочерний элемент, дочерний элемент дочернего элемента и так далее; таким образом ось descendant не содержит узлов атрибутов и пространств имен.

/descendant::*
<AAA>
<BBB>
<DDD>
<CCC>
<DDD/>
<EEE/>
</CCC>
</DDD>
</BBB>
<CCC>
<DDD>
<EEE>
<DDD>
<FFF/>
</DDD>
</EEE>
</DDD>
</CCC>
</AAA>
Выбираются все потомки корневого узла, то есть все элементы

/AAA/BBB/descendant::*
<AAA>
<BBB>
<DDD>
<CCC>
<DDD/>
<EEE/>
</CCC>
</DDD>
</BBB>
<CCC>
<DDD>
<EEE>
<DDD>
<FFF/>
</DDD>
</EEE>
</DDD>
</CCC>
</AAA>
Выбираются все потомки элементов, соответствующих пути /AAA/BBB

//CCC/descendant::*
<AAA>
<BBB>
<DDD>
<CCC>
<DDD/>
<EEE/>
</CCC>
</DDD>
</BBB>
<CCC>
<DDD>
<EEE>
<DDD>
<FFF/>
</DDD>
</EEE>
</DDD>
</CCC>
</AAA>
Выбираются все элементы, имеющие в качестве предка элемент CCC

//CCC/descendant::DDD
<AAA>
<BBB>
<DDD>
<CCC>
<DDD/>
<EEE/>
</CCC>
</DDD>
</BBB>
<CCC>
<DDD>
<EEE>
<DDD>
<FFF/>
</DDD>
</EEE>
</DDD>
</CCC>
</AAA>
Выбираются элементы DDD, имеющие в качестве предка элемент CCC


XPath в примерах

Ось parent содержит родителя контекстного узла, если он существует.

//DDD/parent::*
<AAA>
<BBB>
<DDD>
<CCC>
<DDD/>
<EEE/>
</CCC>
</DDD>
</BBB>
<CCC>
<DDD>
<EEE>
<DDD>
<FFF/>
</DDD>
</EEE>
</DDD>
</CCC>
</AAA>
Выбираются все родители элемента DDD


XPath в примерах

Ось ancestor содержит предков контекстного узла; предками контесктного узла являются родитель контесктного узла, родитель родителя и так далее; Таким образом, ось ancestor всегда включает корневой узел, заисключением случая, когда контекстный узел является корневым.

/AAA/BBB/DDD/CCC/EEE/ancestor::*
<AAA>
<BBB>
<DDD>
<CCC>
<DDD/>
<EEE/>
</CCC>
</DDD>
</BBB>
<CCC>
<DDD>
<EEE>
<DDD>
<FFF/>
</DDD>
</EEE>
</DDD>
</CCC>
</AAA>
Выбираются все узлы, перечисленные в этом абсолютном пути

//FFF/ancestor::*
<AAA>
<BBB>
<DDD>
<CCC>
<DDD/>
<EEE/>
</CCC>
</DDD>
</BBB>
<CCC>
<DDD>
<EEE>
<DDD>
<FFF/>
</DDD>
</EEE>
</DDD>
</CCC>
</AAA>
Выбираются все предки элемента FFF


XPath в примерах

Ось following-sibling содержит все следующих братьев контекстного узла. Братьями называются те узлы, что имеют одного родителя с контекстным.

/AAA/BBB/following-sibling::*
<AAA>
<BBB>
<CCC/>
<DDD/>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>

//CCC/following-sibling::*
<AAA>
<BBB>
<CCC/>
<DDD/>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>


XPath в примерах

Ось preceding-sibling содержит всех предыдущих братьев контекстного узла.

/AAA/XXX/preceding-sibling::*
<AAA>
<BBB>
<CCC/>
<DDD/>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>

//CCC/preceding-sibling::*
<AAA>
<BBB>
<CCC/>
<DDD/>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>


XPath в примерах

Ось following содержит в том же порядке, что и в самом документе, все узлы, идущие после контекстного, за исключением всех потомков, узлов атрибутов и пространств имен.

/AAA/XXX/following::*
<AAA>
<BBB>
<CCC/>
<ZZZ>
<DDD/>
<DDD>
<EEE/>
</DDD>
</ZZZ>
<FFF>
<GGG/>
</FFF>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>

//ZZZ/following::*
<AAA>
<BBB>
<CCC/>
<ZZZ>
<DDD/>
<DDD>
<EEE/>
</DDD>
</ZZZ>
<FFF>
<GGG/>
</FFF>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>


XPath в примерах

Ось preceding содержит в том же порядке, что и в самом документе, все узлы, идущие перед контекстным узлом, исключая любых предков, узлов атрибутов и пространств имен.

/AAA/XXX/preceding::*
<AAA>
<BBB>
<CCC/>
<ZZZ>
<DDD/>
</ZZZ>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>

//GGG/preceding::*
<AAA>
<BBB>
<CCC/>
<ZZZ>
<DDD/>
</ZZZ>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>


XPath в примерах

Ось descendant-or-self содержит контекстный узел и всех его потомков.

/AAA/XXX/descendant-or-self::*
<AAA>
<BBB>
<CCC/>
<ZZZ>
<DDD/>
</ZZZ>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>

//CCC/descendant-or-self::*
<AAA>
<BBB>
<CCC/>
<ZZZ>
<DDD/>
</ZZZ>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>


XPath в примерах

Ось ancestor-or-self содержит контекстный узел и всех его предков; таким образом, эта ось всегда содержит корневой узел.

/AAA/XXX/DDD/EEE/ancestor-or-self::*
<AAA>
<BBB>
<CCC/>
<ZZZ>
<DDD/>
</ZZZ>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>

//GGG/ancestor-or-self::*
<AAA>
<BBB>
<CCC/>
<ZZZ>
<DDD/>
</ZZZ>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>


XPath в примерах

Оси ancestor, descendant, following, preceding и self axes покрывают документ (за исключением узлов атрибутов и пространств имен): они не перескаются и вместе содержат все узлы документа.

//GGG/ancestor::*
<AAA>
<BBB>
<CCC/>
<ZZZ/>
</BBB>
<XXX>
<DDD>
<EEE/>
<FFF>
<HHH/>
<GGG>
<JJJ>
<QQQ/>
</JJJ>
<JJJ/>
</GGG>
<HHH/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>

//GGG/descendant::*
<AAA>
<BBB>
<CCC/>
<ZZZ/>
</BBB>
<XXX>
<DDD>
<EEE/>
<FFF>
<HHH/>
<GGG>
<JJJ>
<QQQ/>
</JJJ>
<JJJ/>
</GGG>
<HHH/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>

//GGG/following::*
<AAA>
<BBB>
<CCC/>
<ZZZ/>
</BBB>
<XXX>
<DDD>
<EEE/>
<FFF>
<HHH/>
<GGG>
<JJJ>
<QQQ/>
</JJJ>
<JJJ/>
</GGG>
<HHH/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>

//GGG/preceding::*
<AAA>
<BBB>
<CCC/>
<ZZZ/>
</BBB>
<XXX>
<DDD>
<EEE/>
<FFF>
<HHH/>
<GGG>
<JJJ>
<QQQ/>
</JJJ>
<JJJ/>
</GGG>
<HHH/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>

//GGG/self::*
<AAA>
<BBB>
<CCC/>
<ZZZ/>
</BBB>
<XXX>
<DDD>
<EEE/>
<FFF>
<HHH/>
<GGG>
<JJJ>
<QQQ/>
</JJJ>
<JJJ/>
</GGG>
<HHH/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>

//GGG/ancestor::* | //GGG/descendant::* | //GGG/following::* | //GGG/preceding::* | //GGG/self::*
<AAA>
<BBB>
<CCC/>
<ZZZ/>
</BBB>
<XXX>
<DDD>
<EEE/>
<FFF>
<HHH/>
<GGG>
<JJJ>
<QQQ/>
</JJJ>
<JJJ/>
</GGG>
<HHH/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>


XPath в примерах

Оператор div производит деление, оператор mod возвращает остаток от деления нацело. Функция floor возвращает максимальное целое чило, не большее аргумента. Функция ceiling возвращает минимальное целое число, не меньшее аргумента.

//BBB[position() mod 2 = 0 ]
<AAA>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<CCC/>
<CCC/>
<CCC/>
</AAA>

//BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]
<AAA>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<CCC/>
<CCC/>
<CCC/>
</AAA>

//CCC[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]
<AAA>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<CCC/>
<CCC/>
<CCC/>
</AAA>


XPath в примерах

Страница 1 | Базовый синтаксис языка XPath похож на адресацию в файловой системе. Если путь начинается с символа '/', то он представляет абсолютный путь к заданному элементу.
Страница 2 | Если путь начинается с //, то будут выбраны все элементы документа, которые соответствуют указанному шаблону.
Страница 3 | Символ '*' указывает, что надо выбрать все элементы, соответствующие пути перед ней.
Страница 4 | Выражение в квадратных скобках позволяет задавать более четкие критерии для элемента. Так число в квадратных скобках обозначает позицию элемента в выбранном множестве. Функция last() позволяет указать последний элемент в выборке.
Страница 5 | Атрибуты определяются префиксом @.
Страница 6 | Значения атрибутов могут служить критерием при выборке. Функция normalize-space() удаляет пробелы в начале и конце параметра, а все последовательности пробельных символов заменяет одиночным пробелом.
Страница 7 | Функция count() возвращает число элементов в указанном множестве.
Страница 8 | Функция name() возвращает имя элемента. Функция starts-with() возвращает истину, если строка первого аргумента начинается строкой второго аргумента. Функция contains() возвращает истину, если строка из первого аргумента содержит строку из второго.
Страница 9 | Функция string-length() возвращает число символов в строке. Следует использовать &lt; вместо <, так как символ '<' зарезервирован для нужд разметки.
Страница 10 | Несколько путей можно скомбинировать с помощью разделителя |.
Страница 11 | Ось child содержит дочерние элементы контекстного узла. Ось child является осью, применяемой по умолчанию, и может быть опущена.
Страница 12 | Ось descendant содержит потомков контекстного узла; потомком является дочерний элемент, дочерний элемент дочернего элемента и так далее; таким образом ось descendant не содержит узлов атрибутов и пространств имен.
Страница 13 | Ось parent содержит родителя контекстного узла, если он существует.
Страница 14 | Ось ancestor содержит предков контекстного узла; предками контесктного узла являются родитель контесктного узла, родитель родителя и так далее; Таким образом, ось ancestor всегда включает корневой узел, заисключением случая, когда контекстный узел является корневым.
Страница 15 | Ось following-sibling содержит все следующих братьев контекстного узла. Братьями называются те узлы, что имеют одного родителя с контекстным.
Страница 16 | Ось preceding-sibling содержит всех предыдущих братьев контекстного узла.
Страница 17 | Ось following содержит в том же порядке, что и в самом документе, все узлы, идущие после контекстного, за исключением всех потомков, узлов атрибутов и пространств имен.
Страница 18 | Ось preceding содержит в том же порядке, что и в самом документе, все узлы, идущие перед контекстным узлом, исключая любых предков, узлов атрибутов и пространств имен.
Страница 19 | Ось descendant-or-self содержит контекстный узел и всех его потомков.
Страница 20 | Ось ancestor-or-self содержит контекстный узел и всех его предков; таким образом, эта ось всегда содержит корневой узел.
Страница 21 | Оси ancestor, descendant, following, preceding и self axes покрывают документ (за исключением узлов атрибутов и пространств имен): они не перескаются и вместе содержат все узлы документа.
Страница 22 | Оператор div производит деление, оператор mod возвращает остаток от деления нацело. Функция floor возвращает максимальное целое чило, не большее аргумента. Функция ceiling возвращает минимальное целое число, не меньшее аргумента.


XSLT в примерах

С XSL вы можете свободно модифицировать исходный текст. Так с помощью преобразований 1 и 2 можно получить различный результат из одного исходного файла.

Преобразование 1

Исходный XML
<source>

<title>XSL</title>
<author>John Smith</author>

</source>

Результат
<h1>XSL</h1>
<h2>John Smith</h2>

Представление HTML

XSL

John Smith
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <h1>
          <xsl:value-of select="//title"/>
     </h1>
     <h2>
          <xsl:value-of select="//author"/>
     </h2>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<title>XSL</title>
<author>John Smith</author>

</source>

Результат
<h2>John Smith</h2>
<h1>XSL</h1>

Представление HTML

John Smith

XSL
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <h2>
          <xsl:value-of select="//author"/>
     </h2>
     <h1>
          <xsl:value-of select="//title"/>
     </h1>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Каждое преобразование XSL должно начинаться с элемента xsl:stylesheet. Атрибут version='1.0' определяет версию спецификации XSL. Этот пример представляет собой простейшее возможное преобразование. Поскольку оно не содержит чего-либо помимо заголовка, то используется обработка по умолчанию.

Преобразование 1

Исходный XML
<source>

<em>Hello, world</em>

</source>

Результат
Hello, world

Представление HTML
Hello, world
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

</xsl:stylesheet>


XSLT в примерах

XSLT-процессоры анализируют исходный XML и пытаются найти подходящий XSL-шаблон. Если такой шаблон найден, то выполняются инструкции внутри него.

Преобразование 1

Исходный XML
<source>

<bold>Hello, world.</bold>
<red>I am </red>
<italic>fine.</italic>

</source>

Результат
<p>
  <b>Hello, world.</b>
</p>

<p style="color:red">I am </p>

<p>
  <i>fine.</i>
</p>

Представление HTML

Hello, world.

I am

fine.

Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="bold">
     <p>
          <b>
               <xsl:value-of select="."/>
          </b>
     </p>
</xsl:template>

<xsl:template match="red">
     <p style="color:red">
          <xsl:value-of select="."/>
     </p>
</xsl:template>

<xsl:template match="italic">
     <p>
          <i>
               <xsl:value-of select="."/>
          </i>
     </p>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Содержание элементов может быть извлечено из исходного документа двумя основными способами. Преобразование 1 использует инструкцию xsl:value-of. В этом случае содержание элемента используется без какой-либо дальнейшей обработки. Инструкция xsl:apply-templates в преобразовании 2 действует по-другому. Здесь XSLT-процессор продолжает обрабатывать выбранные элементы, для которых определен шаблон.

Преобразование 1

Исходный XML
<source>

<employee>
     <firstName>Joe</firstName>
     <surname>Smith</surname>
</employee>

</source>

Результат
<b>
Joe
Smith
</b>

Представление HTML
Joe Smith
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="employee">
     <b>
          <xsl:value-of select="."/>
     </b>
</xsl:template>

<xsl:template match="surname">
     <i>
          <xsl:value-of select="."/>
     </i>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<employee>
     <firstName>Joe</firstName>
     <surname>Smith</surname>
</employee>

</source>

Результат
<b>Joe</b>
<b>
  <i>Smith</i>
</b>

Представление HTML
Joe Smith
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="employee">
     <b>
          <xsl:apply-templates select="firstName"/>
     </b>
     <b>
          <xsl:apply-templates select="surname"/>
     </b>
</xsl:template>

<xsl:template match="surname">
     <i>
          <xsl:value-of select="."/>
     </i>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Части XML-документа, к которым должен применяться шаблон, определяются путями адресации. Их синтаксис описан в Спецификации XPath. В простейших случаях он очень похож на адресацию файловой системы (преобразование 1).

Преобразование 1

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <DDD id="d1"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c2"/>
     </BBB>
</AAA>

</source>

Результат
<div style="color:purple">BBB id=b1</div>

<div style="color:purple">BBB id=b2</div>

<div style="color:purple">BBB id=b3</div>

<div style="color:purple">BBB id=b4</div>

<p style="color:red">DDD id=d1</p>

<div style="color:purple">BBB id=b5</div>

Представление HTML
BBB id=b1
BBB id=b2
BBB id=b3
BBB id=b4

DDD id=d1

BBB id=b5
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="BBB">
     <div style="color:purple">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

<xsl:template match="/source/AAA/CCC/DDD">
     <p style="color:red">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </p>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Обработка всегда начинается с шаблона, где match="/". Это значение пути адресации соответствует корневому узлу (в нашем случае source). Однако многие преобразования XSL не содержат такой шаблон явно. В этом случае используется неявный шаблон (он содержит только единственную инструкцию). Эта инструкция обозначает: обрабатывать все дочерние элементы текущего узла, включая текстовые узлы. Сравните преобразование 1 и преобразование 2. Когда шаблон для узла существует, никакой обработки по умолчанию не происходит (преобразование 3). Если вы хотите включить обработку потомков узла, то вы должны явно указать шаблоны для них (преобразование 4).

Преобразование 1

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <DDD id="d1"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c2"/>
     </BBB>
</AAA>

</source>

Результат
<div style="color:purple">AAA id=a1</div>

<div style="color:purple">AAA id=a2</div>

Представление HTML
AAA id=a1
AAA id=a2
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="AAA">
     <div style="color:purple">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <DDD id="d1"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c2"/>
     </BBB>
</AAA>

</source>

Результат
<div style="color:purple">AAA id=a1</div>

<div style="color:purple">AAA id=a2</div>

Представление HTML
AAA id=a1
AAA id=a2
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates/>
</xsl:template>

<xsl:template match="/source">
     <xsl:apply-templates/>
</xsl:template>

<xsl:template match="AAA">
     <div style="color:purple">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <DDD id="d1"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c2"/>
     </BBB>
</AAA>

</source>

Результат
<div style="color:purple">AAA id=a1</div>

<div style="color:purple">AAA id=a2</div>

Представление HTML
AAA id=a1
AAA id=a2
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="AAA">
     <div style="color:purple">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

<xsl:template match="BBB">
     <div style="color:blue">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

<xsl:template match="CCC">
     <div style="color:maroon">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

<xsl:template match="DDD">
     <div style="color:green">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

</xsl:stylesheet>

Преобразование 4

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <DDD id="d1"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c2"/>
     </BBB>
</AAA>

</source>

Результат
<div style="color:purple">AAA id=a1</div>

<div style="color:blue">BBB id=b1</div>

<div style="color:blue">BBB id=b2</div>

<div style="color:purple">AAA id=a2</div>

<div style="color:blue">BBB id=b3</div>

<div style="color:blue">BBB id=b4</div>

<div style="color:maroon">CCC id=c1</div>

<div style="color:green">DDD id=d1</div>

<div style="color:blue">BBB id=b5</div>

<div style="color:maroon">CCC id=c2</div>

Представление HTML
AAA id=a1
BBB id=b1
BBB id=b2
AAA id=a2
BBB id=b3
BBB id=b4
CCC id=c1
DDD id=d1
BBB id=b5
CCC id=c2
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates/>
</xsl:template>

<xsl:template match="/xslTutorial">
     <xsl:apply-templates/>
</xsl:template>

<xsl:template match="AAA">
     <div style="color:purple">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
     <xsl:apply-templates/>
</xsl:template>

<xsl:template match="BBB">
     <div style="color:blue">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
     <xsl:apply-templates/>
</xsl:template>

<xsl:template match="CCC">
     <div style="color:maroon">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
     <xsl:apply-templates/>
</xsl:template>

<xsl:template match="DDD">
     <div style="color:green">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Соответствие шаблонов определяется путями адресации, где конкретные пути разделяются с помощью символа "|" (преобразование 1). Символ "*" обозначает все возможности. Сравните преобразование 1 и преобразование 2.

Преобразование 1

Исходный XML
<source>

<employee>
     <firstName>Joe</firstName>
     <surname>Smith</surname>
</employee>

</source>

Результат
<div>[template: firstName outputs Joe ]</div>

<div>[template: surname outputs Smith ]</div>

Представление HTML
[template: firstName outputs Joe ]
[template: surname outputs Smith ]
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="firstName|surname">
     <div>
          <xsl:text>[template: </xsl:text>
          <xsl:value-of select="name()"/>
          <xsl:text> outputs </xsl:text>
          <xsl:apply-templates/>
          <xsl:text> ]</xsl:text>
     </div>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<employee>
     <firstName>Joe</firstName>
     <surname>Smith</surname>
</employee>

</source>

Результат
<div>[template: source outputs
<div>[template: employee outputs
<div>[template: firstName outputs Joe ]</div>

     <div>[template: surname outputs Smith ]</div>
]</div>
]</div>

Представление HTML
[template: source outputs
[template: employee outputs
[template: firstName outputs Joe ]
[template: surname outputs Smith ]
]
]
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="*">
     <div>
          <xsl:text>[template: </xsl:text>
          <xsl:value-of select="name()"/>
          <xsl:text> outputs </xsl:text>
          <xsl:apply-templates/>
          <xsl:text> ]</xsl:text>
     </div>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

"//" очень часто встречается в путях адресации. Когда он используется в начале пути адресации, он обозначает: выбрать все узлы определенного типа в документе (преобразование 1). Внутри пути адресации он обозначает: выбрать все узлы, являющиеся потомками узла, указанного в первой части пути адресации (преобразование 2).

Преобразование 1

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <DDD id="d1"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c2"/>
     </BBB>
</AAA>

</source>

Результат
<div style="color:purple">BBB id=b1</div>
<div style="color:purple">BBB id=b2</div>
<div style="color:purple">BBB id=b3</div>
<div style="color:purple">BBB id=b4</div>
<div style="color:purple">BBB id=b5</div>
<div style="color:red">CCC id=c1</div>
<div style="color:red">CCC id=c2</div>
<div style="color:blue">DDD id=d1</div>
<div style="color:navy">AAA id=a1</div>
<div style="color:navy">AAA id=a2</div>

Представление HTML
BBB id=b1
BBB id=b2
BBB id=b3
BBB id=b4
BBB id=b5
CCC id=c1
CCC id=c2
DDD id=d1
AAA id=a1
AAA id=a2
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="//BBB"/>
     <xsl:apply-templates select="//CCC"/>
     <xsl:apply-templates select="//DDD"/>
     <xsl:apply-templates select="//AAA"/>
</xsl:template>

<xsl:template match="AAA">
     <div style="color:navy">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

<xsl:template match="BBB">
     <div style="color:purple">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

<xsl:template match="CCC">
     <div style="color:red">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

<xsl:template match="DDD">
     <div style="color:blue">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <DDD id="d1"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c2"/>
     </BBB>
</AAA>

</source>

Результат
<div style="color:red">CCC id=c1</div>
<div style="color:red">CCC id=c2</div>
<div style="color:red">CCC id=c2</div>

Представление HTML
CCC id=c1
CCC id=c2
CCC id=c2
 <
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="/source/AAA//CCC"/>
     <xsl:apply-templates select="/source//AAA/BBB//*"/>
</xsl:template>

<xsl:template match="AAA">
     <div style="color:navy">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

<xsl:template match="BBB">
     <div style="color:purple">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

<xsl:template match="CCC">
     <div style="color:red">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

<xsl:template match="DDD">
     <div style="color:blue">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

С помощью режимов (modes) элемент может быть обработан многократно, причем каждый раз с различным результатом. В преобразовании 2 один из режимов не существует.

Преобразование 1

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<div style="color:red">CCC id=c1</div>
<div style="color:red">CCC id=c2</div>
<div style="color:red">CCC id=c3</div>
<div style="color:blue">CCC id=c1</div>
<div style="color:blue">CCC id=c2</div>
<div style="color:blue">CCC id=c3</div>
<div style="color:purple">CCC id=c1</div>
<div style="color:purple">CCC id=c2</div>
<div style="color:purple">CCC id=c3</div>

Представление HTML
CCC id=c1
CCC id=c2
CCC id=c3
CCC id=c1
CCC id=c2
CCC id=c3
CCC id=c1
CCC id=c2
CCC id=c3
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="//CCC" mode="red"/>
     <xsl:apply-templates select="//CCC" mode="blue"/>
     <xsl:apply-templates select="//CCC"/>
</xsl:template>

<xsl:template match="CCC" mode="red">
     <div style="color:red">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

<xsl:template match="CCC" mode="blue">
     <div style="color:blue">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

<xsl:template match="CCC">
     <div style="color:purple">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<div style="color:red">CCC id=c1</div>
<div style="color:red">CCC id=c2</div>
<div style="color:red">CCC id=c3</div>

Представление HTML
CCC id=c1
CCC id=c2
CCC id=c3
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="//CCC" mode="red"/>
     <xsl:apply-templates select="//CCC" mode="yellow"/>
</xsl:template>

<xsl:template match="CCC" mode="red">
     <div style="color:red">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

<xsl:template match="CCC">
     <div style="color:purple">
          <xsl:value-of select="name()"/>
          <xsl:text> id=</xsl:text>
          <xsl:value-of select="@id"/>
     </div>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Достаточно часто несколько шаблонов соответствует одному и тому же элементу в исходном XML. Поэтому надо решить, какой из них следует использовать. Для этого можно определить приоритеты с помощью атрибута priority. Если этот атрибут не определен, его приоритет вычисляется в соответствии с несколькими правилами. Преобразование 1 и преобразование 2 различаются приоритетами их шаблонов. Преобразование 3 показывает действие по умолчанию в отсутствие атрибутов priority. Шаблон CCC имеет меньший приоритет по сравнению с CCC/CCC, поскольку он менее специфичный. Сравните преобразование 4 и преобразование 5. Шаблон CCC имеет меньший приоритет, чем CCC/CCC или AAA/CCC/CCC, хотя два последних имеют одинаковый приоритет. В таком случае XSLT-процессор может сообщить об ошибке. Если этого не произошло, XSLT-процессор должен выбрать среди соответствующих шаблонов тот, который будет последним в преобразовании. В преобразовании 6 менее специфичный "*" имеет меньший приоритет по сравнению с CCC. Вычисленные приоритеты располагаются в диапозоне от -0.5 до 0.5. Более подробная информация содержится в Спецификации XSLT.

Преобразование 1

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<h3 style="color:blue">CCC (id=c1)</h3>
<h2 style="color:red">CCC (id=c2)</h2>
<h3 style="color:blue">CCC (id=c3)</h3>

Представление HTML

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="//CCC"/>
</xsl:template>

<xsl:template match="CCC" priority="3">
     <h3 style="color:blue">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h3>
</xsl:template>

<xsl:template match="CCC/CCC" priority="4">
     <h2 style="color:red">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h2>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<h3 style="color:blue">CCC (id=c1)</h3>
<h3 style="color:blue">CCC (id=c2)</h3>
<h3 style="color:blue">CCC (id=c3)</h3>

Представление HTML

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="//CCC"/>
</xsl:template>

<xsl:template match="CCC" priority="4">
     <h3 style="color:blue">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h3>
</xsl:template>

<xsl:template match="CCC/CCC" priority="3">
     <h2 style="color:red">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h2>
</xsl:template>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<h3 style="color:blue">CCC (id=c1)</h3>
<h2 style="color:red">CCC (id=c2)</h2>
<h3 style="color:blue">CCC (id=c3)</h3>

Представление HTML

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="//CCC"/>
</xsl:template>

<xsl:template match="CCC">
     <h3 style="color:blue">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h3>
</xsl:template>

<xsl:template match="CCC/CCC">
     <h2 style="color:red">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h2>
</xsl:template>

</xsl:stylesheet>

Преобразование 4

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<h3 style="color:blue">CCC (id=c1)</h3>
<h2 style="color:green">CCC (id=c2)</h2>
<h3 style="color:blue">CCC (id=c3)</h3>

Представление HTML

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="//CCC"/>
</xsl:template>

<xsl:template match="CCC">
     <h3 style="color:blue">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h3>
</xsl:template>

<xsl:template match="CCC/CCC">
     <h2 style="color:red">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h2>
</xsl:template>

<xsl:template match="AAA/CCC/CCC">
     <h2 style="color:green">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h2>
</xsl:template>

</xsl:stylesheet>

Преобразование 5

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<h3 style="color:blue">CCC (id=c1)</h3>
<h2 style="color:red">CCC (id=c2)</h2>
<h3 style="color:blue">CCC (id=c3)</h3>

Представление HTML

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="//CCC"/>
</xsl:template>

<xsl:template match="CCC">
     <h3 style="color:blue">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h3>
</xsl:template>

<xsl:template match="AAA/CCC/CCC">
     <h2 style="color:green">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h2>
</xsl:template>

<xsl:template match="CCC/CCC">
     <h2 style="color:red">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h2>
</xsl:template>

</xsl:stylesheet>

Преобразование 6

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<h3 style="color:blue">CCC (id=c1)</h3>
<h3 style="color:blue">CCC (id=c2)</h3>
<h3 style="color:blue">CCC (id=c3)</h3>
<h3 style="color:maroon">AAA (id=a1)</h3>
<h3 style="color:maroon">AAA (id=a2)</h3>

Представление HTML

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)

AAA (id=a1)

AAA (id=a2)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="//CCC"/>
     <xsl:apply-templates select="//AAA"/>
</xsl:template>

<xsl:template match="CCC">
     <h3 style="color:blue">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h3>
</xsl:template>

<xsl:template match="*">
     <h3 style="color:maroon">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h3>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

К атрибутам можно обращаться также, как и к элементам. Надо только поставить "@" перед именем атрибута.

Преобразование 1

Исходный XML
<source>

<dog name="Joe">
     <data weight="18 kg" color="black"/>
</dog>

</source>

Результат
<p>
  <b>Dog: </b>Joe</p>
<p>
  <b>Color: </b>black</p>

Представление HTML

Dog: Joe

Color: black
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="dog">
     <p>
          <b>
               <xsl:text>Dog: </xsl:text>
          </b>
          <xsl:value-of select="@name"/>
     </p>
     <p>
          <b>
               <xsl:text>Color: </xsl:text>
          </b>
          <xsl:value-of select="data/@color"/>
     </p>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Атрибуты можно обрабатывать аналогично элементам.

Преобразование 1

Исходный XML
<source>

<employee id="js0034"> Joe Smith </employee>

</source>

Результат
Joe Smith
[<b>
  <i>js0034</i>
</b>]

Представление HTML
Joe Smith [ js0034 ]
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="employee">
     <xsl:value-of select="."/>
     <xsl:text>[</xsl:text>
     <xsl:apply-templates select="@id"/>
     <xsl:text>]</xsl:text>
</xsl:template>

<xsl:template match="@id">
     <b>
          <i>
               <xsl:value-of select="."/>
          </i>
     </b>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Вы также можете выбирать элементы, которые содержат или не содержат данный атрибут. Преобразование 1 включает, а преобразование 2 исключает элементы, если определенный элемент присутствует.

Преобразование 1

Исходный XML
<source>

<car id="a234" checked="yes"/>
<car id="a111" checked="yes"/>
<car id="a005"/>

</source>

Результат
<p>Car: a234</p>

<p>Car: a111</p>

Представление HTML

Car: a234

Car: a111
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="car[@checked]">
     <p>
          <xsl:text>Car: </xsl:text>
          <xsl:value-of select="@id"/>
     </p>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<car id="a234" checked="yes"/>
<car id="a111" checked="yes"/>
<car id="a005"/>

</source>

Результат
<p>Car: a005</p>

Представление HTML

Car: a005
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="car[not(@checked)]">
     <p>
          <xsl:text>Car: </xsl:text>
          <xsl:value-of select="@id"/>
     </p>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Оси играют очень важную роль в XSLT. Для более подробной информации читайте XSLT reference. Сравните: ось child (преобразование 1), ось descendant (преобразование 2), ось parent (преобразование 3), ось ancestor (преобразование 4), ось following-sibling (преобразование 5), ось preceding-sibling (преобразование 6), ось following (преобразование 7), ось preceding (преобразование 8), ось attribute (преобразование 9), ось namespace (преобразование 10), ось self (преобразование 11), ось descendant-or-self (преобразование 12), ось ancestor-or-self (преобразование 13).

Преобразование 1

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<table border="1" cellpadding="6">
  <tr>
     <th colspan="2">Axis: child</th>
  </tr>
  <tr>
     <th>Element</th>
     <th>Node-set</th>
  </tr>
  <tr>
     <td>AAA id = a1</td>
     <td>b1 b2 </td>
  </tr>
  <tr>
     <td>BBB id = b1</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b2</td>
     <td/>
  </tr>
  <tr>
     <td>AAA id = a2</td>
     <td>b3 b4 c1 b5 </td>
  </tr>
  <tr>
     <td>BBB id = b3</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b4</td>
     <td/>
  </tr>
  <tr>
     <td>CCC id = c1</td>
     <td>c2 </td>
  </tr>
  <tr>
     <td>CCC id = c2</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b5</td>
     <td>c3 </td>
  </tr>
  <tr>
     <td>CCC id = c3</td>
     <td/>
  </tr>
</table>

Представление HTML
Axis: child
Element | Node-set
AAA id = a1 | b1 b2
BBB id = b1 |
BBB id = b2 |
AAA id = a2 | b3 b4 c1 b5
BBB id = b3 |
BBB id = b4 |
CCC id = c1 | c2
CCC id = c2 |
BBB id = b5 | c3
CCC id = c3 |
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <table border="1" cellpadding="6">
          <tr>
               <th colspan="2">Axis: child</th>
          </tr>
          <tr>
               <th>Element</th>
               <th>Node-set</th>
          </tr>
          <xsl:for-each select="/source//*">
               <xsl:call-template name="print"/>
          </xsl:for-each>
     </table>
</xsl:template>

<xsl:template name="print">
     <tr>
          <td>
               <xsl:value-of select="name()"/>
               <xsl:text> id = </xsl:text>
               <xsl:value-of select="./@id"/>
          </td>
          <td>
               <xsl:for-each select="child::*">
                    <xsl:value-of select="./@id"/>
                    <xsl:text> </xsl:text>
               </xsl:for-each>
          </td>
     </tr>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<table border="1" cellpadding="6">
  <tr>
     <th colspan="2">Axis: descendant</th>
  </tr>
  <tr>
     <th>Element</th>
     <th>Node-set</th>
  </tr>
  <tr>
     <td>AAA id = a1</td>
     <td>b1 b2 </td>
  </tr>
  <tr>
     <td>BBB id = b1</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b2</td>
     <td/>
  </tr>
  <tr>
     <td>AAA id = a2</td>
     <td>b3 b4 c1 c2 b5 c3 </td>
  </tr>
  <tr>
     <td>BBB id = b3</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b4</td>
     <td/>
  </tr>
  <tr>
     <td>CCC id = c1</td>
     <td>c2 </td>
  </tr>
  <tr>
     <td>CCC id = c2</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b5</td>
     <td>c3 </td>
  </tr>
  <tr>
     <td>CCC id = c3</td>
     <td/>
  </tr>
</table>

Представление HTML
Axis: descendant
Element | Node-set
AAA id = a1 | b1 b2
BBB id = b1 |
BBB id = b2 |
AAA id = a2 | b3 b4 c1 c2 b5 c3
BBB id = b3 |
BBB id = b4 |
CCC id = c1 | c2
CCC id = c2 |
BBB id = b5 | c3
CCC id = c3 |
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <table border="1" cellpadding="6">
          <tr>
               <th colspan="2">Axis: descendant</th>
          </tr>
          <tr>
               <th>Element</th>
               <th>Node-set</th>
          </tr>
          <xsl:for-each select="/source//*">
               <xsl:call-template name="print"/>
          </xsl:for-each>
     </table>
</xsl:template>

<xsl:template name="print">
     <tr>
          <td>
               <xsl:value-of select="name()"/>
               <xsl:text> id = </xsl:text>
               <xsl:value-of select="./@id"/>
          </td>
          <td>
               <xsl:for-each select="descendant::*">
                    <xsl:value-of select="./@id"/>
                    <xsl:text> </xsl:text>
               </xsl:for-each>
          </td>
     </tr>
</xsl:template>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<table border="1" cellpadding="6">
  <tr>
     <th colspan="2">Axis: parent</th>
  </tr>
  <tr>
     <th>Element</th>
     <th>Node-set</th>
  </tr>
  <tr>
     <td>AAA id = a1</td>
     <td>source </td>
  </tr>
  <tr>
     <td>BBB id = b1</td>
     <td>a1 </td>
  </tr>
  <tr>
     <td>BBB id = b2</td>
     <td>a1 </td>
  </tr>
  <tr>
     <td>AAA id = a2</td>
     <td>source </td>
  </tr>
  <tr>
     <td>BBB id = b3</td>
     <td>a2 </td>
  </tr>
  <tr>
     <td>BBB id = b4</td>
     <td>a2 </td>
  </tr>
  <tr>
     <td>CCC id = c1</td>
     <td>a2 </td>
  </tr>
  <tr>
     <td>CCC id = c2</td>
     <td>c1 </td>
  </tr>
  <tr>
     <td>BBB id = b5</td>
     <td>a2 </td>
  </tr>
  <tr>
     <td>CCC id = c3</td>
     <td>b5 </td>
  </tr>
</table>

Представление HTML
Axis: parent
Element | Node-set
AAA id = a1 | source
BBB id = b1 | a1
BBB id = b2 | a1
AAA id = a2 | source
BBB id = b3 | a2
BBB id = b4 | a2
CCC id = c1 | a2
CCC id = c2 | c1
BBB id = b5 | a2
CCC id = c3 | b5
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <table border="1" cellpadding="6">
          <tr>
               <th colspan="2">Axis: parent</th>
          </tr>
          <tr>
               <th>Element</th>
               <th>Node-set</th>
          </tr>
          <xsl:for-each select="/source//*">
               <xsl:call-template name="print"/>
          </xsl:for-each>
     </table>
</xsl:template>

<xsl:template name="print">
     <tr>
          <td>
               <xsl:value-of select="name()"/>
               <xsl:text> id = </xsl:text>
               <xsl:value-of select="./@id"/>
          </td>
          <td>
               <xsl:for-each select="parent::*">
                    <xsl:if test="not(@id)">
                         <xsl:value-of select="name()"/>
                    </xsl:if>
                    <xsl:value-of select="./@id"/>
                    <xsl:text> </xsl:text>
               </xsl:for-each>
          </td>
     </tr>
</xsl:template>

</xsl:stylesheet>

Преобразование 4

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<table border="1" cellpadding="6">
  <tr>
     <th colspan="2">Axis: ancestor</th>
  </tr>
  <tr>
     <th>Element</th>
     <th>Node-set</th>
  </tr>
  <tr>
     <td>AAA id = a1</td>
     <td>source </td>
  </tr>
  <tr>
     <td>BBB id = b1</td>
     <td>source a1 </td>
  </tr>
  <tr>
     <td>BBB id = b2</td>
     <td>source a1 </td>
  </tr>
  <tr>
     <td>AAA id = a2</td>
     <td>source </td>
  </tr>
  <tr>
     <td>BBB id = b3</td>
     <td>source a2 </td>
  </tr>
  <tr>
     <td>BBB id = b4</td>
     <td>source a2 </td>
  </tr>
  <tr>
     <td>CCC id = c1</td>
     <td>source a2 </td>
  </tr>
  <tr>
     <td>CCC id = c2</td>
     <td>source a2 c1 </td>
  </tr>
  <tr>
     <td>BBB id = b5</td>
     <td>source a2 </td>
  </tr>
  <tr>
     <td>CCC id = c3</td>
     <td>source a2 b5 </td>
  </tr>
</table>

Представление HTML
Axis: ancestor
Element | Node-set
AAA id = a1 | source
BBB id = b1 | source a1
BBB id = b2 | source a1
AAA id = a2 | source
BBB id = b3 | source a2
BBB id = b4 | source a2
CCC id = c1 | source a2
CCC id = c2 | source a2 c1
BBB id = b5 | source a2
CCC id = c3 | source a2 b5
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <table border="1" cellpadding="6">
          <tr>
               <th colspan="2">Axis: ancestor</th>
          </tr>
          <tr>
               <th>Element</th>
               <th>Node-set</th>
          </tr>
          <xsl:for-each select="/source//*">
               <xsl:call-template name="print"/>
          </xsl:for-each>
     </table>
</xsl:template>

<xsl:template name="print">
     <tr>
          <td>
               <xsl:value-of select="name()"/>
               <xsl:text> id = </xsl:text>
               <xsl:value-of select="./@id"/>
          </td>
          <td>
               <xsl:for-each select="ancestor::*">
                    <xsl:if test="not(@id)">
                         <xsl:value-of select="name()"/>
                    </xsl:if>
                    <xsl:value-of select="./@id"/>
                    <xsl:text> </xsl:text>
               </xsl:for-each>
          </td>
     </tr>
</xsl:template>

</xsl:stylesheet>

Преобразование 5

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<table border="1" cellpadding="6">
  <tr>
     <th colspan="2">Axis: following-sibling</th>
  </tr>
  <tr>
     <th>Element</th>
     <th>Node-set</th>
  </tr>
  <tr>
     <td>AAA id = a1</td>
     <td>a2 </td>
  </tr>
  <tr>
     <td>BBB id = b1</td>
     <td>b2 </td>
  </tr>
  <tr>
     <td>BBB id = b2</td>
     <td/>
  </tr>
  <tr>
     <td>AAA id = a2</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b3</td>
     <td>b4 c1 b5 </td>
  </tr>
  <tr>
     <td>BBB id = b4</td>
     <td>c1 b5 </td>
  </tr>
  <tr>
     <td>CCC id = c1</td>
     <td>b5 </td>
  </tr>
  <tr>
     <td>CCC id = c2</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b5</td>
     <td/>
  </tr>
  <tr>
     <td>CCC id = c3</td>
     <td/>
  </tr>
</table>

Представление HTML
Axis: following-sibling
Element | Node-set
AAA id = a1 | a2
BBB id = b1 | b2
BBB id = b2 |
AAA id = a2 |
BBB id = b3 | b4 c1 b5
BBB id = b4 | c1 b5
CCC id = c1 | b5
CCC id = c2 |
BBB id = b5 |
CCC id = c3 |
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <table border="1" cellpadding="6">
          <tr>
               <th colspan="2">Axis: following-sibling</th>
          </tr>
          <tr>
               <th>Element</th>
               <th>Node-set</th>
          </tr>
          <xsl:for-each select="/source//*">
               <xsl:call-template name="print"/>
          </xsl:for-each>
     </table>
</xsl:template>

<xsl:template name="print">
     <tr>
          <td>
               <xsl:value-of select="name()"/>
               <xsl:text> id = </xsl:text>
               <xsl:value-of select="./@id"/>
          </td>
          <td>
               <xsl:for-each select="following-sibling::*">
                    <xsl:if test="not(@id)">
                         <xsl:value-of select="name()"/>
                    </xsl:if>
                    <xsl:value-of select="./@id"/>
                    <xsl:text> </xsl:text>
               </xsl:for-each>
          </td>
     </tr>
</xsl:template>

</xsl:stylesheet>

Преобразование 6

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<table border="1" cellpadding="6">
  <tr>
     <th colspan="2">Axis: preceding-sibling</th>
  </tr>
  <tr>
     <th>Element</th>
     <th>Node-set</th>
  </tr>
  <tr>
     <td>AAA id = a1</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b1</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b2</td>
     <td>b1 </td>
  </tr>
  <tr>
     <td>AAA id = a2</td>
     <td>a1 </td>
  </tr>
  <tr>
     <td>BBB id = b3</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b4</td>
     <td>b3 </td>
  </tr>
  <tr>
     <td>CCC id = c1</td>
     <td>b3 b4 </td>
  </tr>
  <tr>
     <td>CCC id = c2</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b5</td>
     <td>b3 b4 c1 </td>
  </tr>
  <tr>
     <td>CCC id = c3</td>
     <td/>
  </tr>
</table>

Представление HTML
Axis: preceding-sibling
Element | Node-set
AAA id = a1 |
BBB id = b1 |
BBB id = b2 | b1
AAA id = a2 | a1
BBB id = b3 |
BBB id = b4 | b3
CCC id = c1 | b3 b4
CCC id = c2 |
BBB id = b5 | b3 b4 c1
CCC id = c3 |
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <table border="1" cellpadding="6">
          <tr>
               <th colspan="2">Axis: preceding-sibling</th>
          </tr>
          <tr>
               <th>Element</th>
               <th>Node-set</th>
          </tr>
          <xsl:for-each select="/source//*">
               <xsl:call-template name="print"/>
          </xsl:for-each>
     </table>
</xsl:template>

<xsl:template name="print">
     <tr>
          <td>
               <xsl:value-of select="name()"/>
               <xsl:text> id = </xsl:text>
               <xsl:value-of select="./@id"/>
          </td>
          <td>
               <xsl:for-each select="preceding-sibling::*">
                    <xsl:if test="not(@id)">
                         <xsl:value-of select="name()"/>
                    </xsl:if>
                    <xsl:value-of select="./@id"/>
                    <xsl:text> </xsl:text>
               </xsl:for-each>
          </td>
     </tr>
</xsl:template>

</xsl:stylesheet>

Преобразование 7

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<table border="1" cellpadding="6">
  <tr>
     <th colspan="2">Axis: following</th>
  </tr>
  <tr>
     <th>Element</th>
     <th>Node-set</th>
  </tr>
  <tr>
     <td>AAA id = a1</td>
     <td>a2 b3 b4 c1 c2 b5 c3 </td>
  </tr>
  <tr>
     <td>BBB id = b1</td>
     <td>b2 a2 b3 b4 c1 c2 b5 c3 </td>
  </tr>
  <tr>
     <td>BBB id = b2</td>
     <td>a2 b3 b4 c1 c2 b5 c3 </td>
  </tr>
  <tr>
     <td>AAA id = a2</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b3</td>
     <td>b4 c1 c2 b5 c3 </td>
  </tr>
  <tr>
     <td>BBB id = b4</td>
     <td>c1 c2 b5 c3 </td>
  </tr>
  <tr>
     <td>CCC id = c1</td>
     <td>b5 c3 </td>
  </tr>
  <tr>
     <td>CCC id = c2</td>
     <td>b5 c3 </td>
  </tr>
  <tr>
     <td>BBB id = b5</td>
     <td/>
  </tr>
  <tr>
     <td>CCC id = c3</td>
     <td/>
  </tr>
</table>

Представление HTML
Axis: following
Element | Node-set
AAA id = a1 | a2 b3 b4 c1 c2 b5 c3
BBB id = b1 | b2 a2 b3 b4 c1 c2 b5 c3
BBB id = b2 | a2 b3 b4 c1 c2 b5 c3
AAA id = a2 |
BBB id = b3 | b4 c1 c2 b5 c3
BBB id = b4 | c1 c2 b5 c3
CCC id = c1 | b5 c3
CCC id = c2 | b5 c3
BBB id = b5 |
CCC id = c3 |
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <table border="1" cellpadding="6">
          <tr>
               <th colspan="2">Axis: following</th>
          </tr>
          <tr>
               <th>Element</th>
               <th>Node-set</th>
          </tr>
          <xsl:for-each select="/source//*">
               <xsl:call-template name="print"/>
          </xsl:for-each>
     </table>
</xsl:template>

<xsl:template name="print">
     <tr>
          <td>
               <xsl:value-of select="name()"/>
               <xsl:text> id = </xsl:text>
               <xsl:value-of select="./@id"/>
          </td>
          <td>
               <xsl:for-each select="following::*">
                    <xsl:if test="not(@id)">
                         <xsl:value-of select="name()"/>
                    </xsl:if>
                    <xsl:value-of select="./@id"/>
                    <xsl:text> </xsl:text>
               </xsl:for-each>
          </td>
     </tr>
</xsl:template>

</xsl:stylesheet>

Преобразование 8

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<table border="1" cellpadding="6">
  <tr>
     <th colspan="2">Axis: preceding</th>
  </tr>
  <tr>
     <th>Element</th>
     <th>Node-set</th>
  </tr>
  <tr>
     <td>AAA id = a1</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b1</td>
     <td/>
  </tr>
  <tr>
     <td>BBB id = b2</td>
     <td>b1 </td>
  </tr>
  <tr>
     <td>AAA id = a2</td>
     <td>a1 b1 b2 </td>
  </tr>
  <tr>
     <td>BBB id = b3</td>
     <td>a1 b1 b2 </td>
  </tr>
  <tr>
     <td>BBB id = b4</td>
     <td>a1 b1 b2 b3 </td>
  </tr>
  <tr>
     <td>CCC id = c1</td>
     <td>a1 b1 b2 b3 b4 </td>
  </tr>
  <tr>
     <td>CCC id = c2</td>
     <td>a1 b1 b2 b3 b4 </td>
  </tr>
  <tr>
     <td>BBB id = b5</td>
     <td>a1 b1 b2 b3 b4 c1 c2 </td>
  </tr>
  <tr>
     <td>CCC id = c3</td>
     <td>a1 b1 b2 b3 b4 c1 c2 </td>
  </tr>
</table>

Представление HTML
Axis: preceding
Element | Node-set
AAA id = a1 |
BBB id = b1 |
BBB id = b2 | b1
AAA id = a2 | a1 b1 b2
BBB id = b3 | a1 b1 b2
BBB id = b4 | a1 b1 b2 b3
CCC id = c1 | a1 b1 b2 b3 b4
CCC id = c2 | a1 b1 b2 b3 b4
BBB id = b5 | a1 b1 b2 b3 b4 c1 c2
CCC id = c3 | a1 b1 b2 b3 b4 c1 c2
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <table border="1" cellpadding="6">
          <tr>
               <th colspan="2">Axis: preceding</th>
          </tr>
          <tr>
               <th>Element</th>
               <th>Node-set</th>
          </tr>
          <xsl:for-each select="/source//*">
               <xsl:call-template name="print"/>
          </xsl:for-each>
     </table>
</xsl:template>

<xsl:template name="print">
     <tr>
          <td>
               <xsl:value-of select="name()"/>
               <xsl:text> id = </xsl:text>
               <xsl:value-of select="./@id"/>
          </td>
          <td>
               <xsl:for-each select="preceding::*">
                    <xsl:if test="not(@id)">
                         <xsl:value-of select="name()"/>
                    </xsl:if>
                    <xsl:value-of select="./@id"/>
                    <xsl:text> </xsl:text>
               </xsl:for-each>
          </td>
     </tr>
</xsl:template>

</xsl:stylesheet>

Преобразование 9

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<table border="1" cellpadding="6">
  <tr>
     <th colspan="2">Axis: attribute</th>
  </tr>
  <tr>
     <th>Element</th>
     <th>Node-set</th>
  </tr>
  <tr>
     <td>AAA id = a1</td>
     <td>id pos </td>
  </tr>
  <tr>
     <td>BBB id = b1</td>
     <td>id </td>
  </tr>
  <tr>
     <td>BBB id = b2</td>
     <td>id </td>
  </tr>
  <tr>
     <td>AAA id = a2</td>
     <td>id </td>
  </tr>
  <tr>
     <td>BBB id = b3</td>
     <td>id </td>
  </tr>
  <tr>
     <td>BBB id = b4</td>
     <td>id </td>
  </tr>
  <tr>
     <td>CCC id = c1</td>
     <td>id </td>
  </tr>
  <tr>
     <td>CCC id = c2</td>
     <td>id </td>
  </tr>
  <tr>
     <td>BBB id = b5</td>
     <td>id </td>
  </tr>
  <tr>
     <td>CCC id = c3</td>
     <td>id </td>
  </tr>
</table>

Представление HTML
Axis: attribute
Element | Node-set
AAA id = a1 | id pos
BBB id = b1 | id
BBB id = b2 | id
AAA id = a2 | id
BBB id = b3 | id
BBB id = b4 | id
CCC id = c1 | id
CCC id = c2 | id
BBB id = b5 | id
CCC id = c3 | id
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <table border="1" cellpadding="6">
          <tr>
               <th colspan="2">Axis: attribute</th>
          </tr>
          <tr>
               <th>Element</th>
               <th>Node-set</th>
          </tr>
          <xsl:for-each select="/source//*">
               <xsl:call-template name="print"/>
          </xsl:for-each>
     </table>
</xsl:template>

<xsl:template name="print">
     <tr>
          <td>
               <xsl:value-of select="name()"/>
               <xsl:text> id = </xsl:text>
               <xsl:value-of select="./@id"/>
          </td>
          <td>
               <xsl:for-each select="attribute::*">
                    <xsl:if test="not(@id)">
                         <xsl:value-of select="name()"/>
                    </xsl:if>
                    <xsl:value-of select="./@id"/>
                    <xsl:text> </xsl:text>
               </xsl:for-each>
          </td>
     </tr>
</xsl:template>

</xsl:stylesheet>

Преобразование 10

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<table border="1" cellpadding="6">
  <tr>
     <th colspan="2">Axis: namespace</th>
  </tr>
  <tr>
     <th>Element</th>
     <th>Node-set</th>
  </tr>
  <tr>
     <td>AAA id = a1</td>
     <td>xml </td>
  </tr>
  <tr>
     <td>BBB id = b1</td>
     <td>xml </td>
  </tr>
  <tr>
     <td>BBB id = b2</td>
     <td>xml </td>
  </tr>
  <tr>
     <td>AAA id = a2</td>
     <td>xml </td>
  </tr>
  <tr>
     <td>BBB id = b3</td>
     <td>xml </td>
  </tr>
  <tr>
     <td>BBB id = b4</td>
     <td>xml </td>
  </tr>
  <tr>
     <td>CCC id = c1</td>
     <td>xml </td>
  </tr>
  <tr>
     <td>CCC id = c2</td>
     <td>xml </td>
  </tr>
  <tr>
     <td>BBB id = b5</td>
     <td>xml </td>
  </tr>
  <tr>
     <td>CCC id = c3</td>
     <td>xml </td>
  </tr>
</table>

Представление HTML
Axis: namespace
Element | Node-set
AAA id = a1 | xml
BBB id = b1 | xml
BBB id = b2 | xml
AAA id = a2 | xml
BBB id = b3 | xml
BBB id = b4 | xml
CCC id = c1 | xml
CCC id = c2 | xml
BBB id = b5 | xml
CCC id = c3 | xml
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <table border="1" cellpadding="6">
          <tr>
               <th colspan="2">Axis: namespace</th>
          </tr>
          <tr>
               <th>Element</th>
               <th>Node-set</th>
          </tr>
          <xsl:for-each select="/source//*">
               <xsl:call-template name="print"/>
          </xsl:for-each>
     </table>
</xsl:template>

<xsl:template name="print">
     <tr>
          <td>
               <xsl:value-of select="name()"/>
               <xsl:text> id = </xsl:text>
               <xsl:value-of select="./@id"/>
          </td>
          <td>
               <xsl:for-each select="namespace::*">
                    <xsl:if test="not(@id)">
                         <xsl:value-of select="name()"/>
                    </xsl:if>
                    <xsl:value-of select="./@id"/>
                    <xsl:text> </xsl:text>
               </xsl:for-each>
          </td>
     </tr>
</xsl:template>

</xsl:stylesheet>

Преобразование 11

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<table border="1" cellpadding="6">
  <tr>
     <th colspan="2">Axis: self</th>
  </tr>
  <tr>
     <th>Element</th>
     <th>Node-set</th>
  </tr>
  <tr>
     <td>AAA id = a1</td>
     <td>a1 </td>
  </tr>
  <tr>
     <td>BBB id = b1</td>
     <td>b1 </td>
  </tr>
  <tr>
     <td>BBB id = b2</td>
     <td>b2 </td>
  </tr>
  <tr>
     <td>AAA id = a2</td>
     <td>a2 </td>
  </tr>
  <tr>
     <td>BBB id = b3</td>
     <td>b3 </td>
  </tr>
  <tr>
     <td>BBB id = b4</td>
     <td>b4 </td>
  </tr>
  <tr>
     <td>CCC id = c1</td>
     <td>c1 </td>
  </tr>
  <tr>
     <td>CCC id = c2</td>
     <td>c2 </td>
  </tr>
  <tr>
     <td>BBB id = b5</td>
     <td>b5 </td>
  </tr>
  <tr>
     <td>CCC id = c3</td>
     <td>c3 </td>
  </tr>
</table>

Представление HTML
Axis: self
Element | Node-set
AAA id = a1 | a1
BBB id = b1 | b1
BBB id = b2 | b2
AAA id = a2 | a2
BBB id = b3 | b3
BBB id = b4 | b4
CCC id = c1 | c1
CCC id = c2 | c2
BBB id = b5 | b5
CCC id = c3 | c3
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <table border="1" cellpadding="6">
          <tr>
               <th colspan="2">Axis: self</th>
          </tr>
          <tr>
               <th>Element</th>
               <th>Node-set</th>
          </tr>
          <xsl:for-each select="/source//*">
               <xsl:call-template name="print"/>
          </xsl:for-each>
     </table>
</xsl:template>

<xsl:template name="print">
     <tr>
          <td>
               <xsl:value-of select="name()"/>
               <xsl:text> id = </xsl:text>
               <xsl:value-of select="./@id"/>
          </td>
          <td>
               <xsl:for-each select="self::*">
                    <xsl:if test="not(@id)">
                         <xsl:value-of select="name()"/>
                    </xsl:if>
                    <xsl:value-of select="./@id"/>
                    <xsl:text> </xsl:text>
               </xsl:for-each>
          </td>
     </tr>
</xsl:template>

</xsl:stylesheet>

Преобразование 12

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<table border="1" cellpadding="6">
  <tr>
     <th colspan="2">Axis: descendant-or-self</th>
  </tr>
  <tr>
     <th>Element</th>
     <th>Node-set</th>
  </tr>
  <tr>
     <td>AAA id = a1</td>
     <td>a1 b1 b2 </td>
  </tr>
  <tr>
     <td>BBB id = b1</td>
     <td>b1 </td>
  </tr>
  <tr>
     <td>BBB id = b2</td>
     <td>b2 </td>
  </tr>
  <tr>
     <td>AAA id = a2</td>
     <td>a2 b3 b4 c1 c2 b5 c3 </td>
  </tr>
  <tr>
     <td>BBB id = b3</td>
     <td>b3 </td>
  </tr>
  <tr>
     <td>BBB id = b4</td>
     <td>b4 </td>
  </tr>
  <tr>
     <td>CCC id = c1</td>
     <td>c1 c2 </td>
  </tr>
  <tr>
     <td>CCC id = c2</td>
     <td>c2 </td>
  </tr>
  <tr>
     <td>BBB id = b5</td>
     <td>b5 c3 </td>
  </tr>
  <tr>
     <td>CCC id = c3</td>
     <td>c3 </td>
  </tr>
</table>

Представление HTML
Axis: descendant-or-self
Element | Node-set
AAA id = a1 | a1 b1 b2
BBB id = b1 | b1
BBB id = b2 | b2
AAA id = a2 | a2 b3 b4 c1 c2 b5 c3
BBB id = b3 | b3
BBB id = b4 | b4
CCC id = c1 | c1 c2
CCC id = c2 | c2
BBB id = b5 | b5 c3
CCC id = c3 | c3
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <table border="1" cellpadding="6">
          <tr>
               <th colspan="2">Axis: descendant-or-self</th>
          </tr>
          <tr>
               <th>Element</th>
               <th>Node-set</th>
          </tr>
          <xsl:for-each select="/source//*">
               <xsl:call-template name="print"/>
          </xsl:for-each>
     </table>
</xsl:template>

<xsl:template name="print">
     <tr>
          <td>
               <xsl:value-of select="name()"/>
               <xsl:text> id = </xsl:text>
               <xsl:value-of select="./@id"/>
          </td>
          <td>
               <xsl:for-each select="descendant-or-self::*">
                    <xsl:if test="not(@id)">
                         <xsl:value-of select="name()"/>
                    </xsl:if>
                    <xsl:value-of select="./@id"/>
                    <xsl:text> </xsl:text>
               </xsl:for-each>
          </td>
     </tr>
</xsl:template>

</xsl:stylesheet>

Преобразование 13

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<table border="1" cellpadding="6">
  <tr>
     <th colspan="2">Axis: ancestor-or-self </th>
  </tr>
  <tr>
     <th>Element</th>
     <th>Node-set</th>
  </tr>
  <tr>
     <td>AAA id = a1</td>
     <td>source a1 </td>
  </tr>
  <tr>
     <td>BBB id = b1</td>
     <td>source a1 b1 </td>
  </tr>
  <tr>
     <td>BBB id = b2</td>
     <td>source a1 b2 </td>
  </tr>
  <tr>
     <td>AAA id = a2</td>
     <td>source a2 </td>
  </tr>
  <tr>
     <td>BBB id = b3</td>
     <td>source a2 b3 </td>
  </tr>
  <tr>
     <td>BBB id = b4</td>
     <td>source a2 b4 </td>
  </tr>
  <tr>
     <td>CCC id = c1</td>
     <td>source a2 c1 </td>
  </tr>
  <tr>
     <td>CCC id = c2</td>
     <td>source a2 c1 c2 </td>
  </tr>
  <tr>
     <td>BBB id = b5</td>
     <td>source a2 b5 </td>
  </tr>
  <tr>
     <td>CCC id = c3</td>
     <td>source a2 b5 c3 </td>
  </tr>
</table>

Представление HTML
Axis: ancestor-or-self
Element | Node-set
AAA id = a1 | source a1
BBB id = b1 | source a1 b1
BBB id = b2 | source a1 b2
AAA id = a2 | source a2
BBB id = b3 | source a2 b3
BBB id = b4 | source a2 b4
CCC id = c1 | source a2 c1
CCC id = c2 | source a2 c1 c2
BBB id = b5 | source a2 b5
CCC id = c3 | source a2 b5 c3
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <table border="1" cellpadding="6">
          <tr>
               <th colspan="2">Axis: ancestor-or-self </th>
          </tr>
          <tr>
               <th>Element</th>
               <th>Node-set</th>
          </tr>
          <xsl:for-each select="/source//*">
               <xsl:call-template name="print"/>
          </xsl:for-each>
     </table>
</xsl:template>

<xsl:template name="print">
     <tr>
          <td>
               <xsl:value-of select="name()"/>
               <xsl:text> id = </xsl:text>
               <xsl:value-of select="./@id"/>
          </td>
          <td>
               <xsl:for-each select="ancestor-or-self ::*">
                    <xsl:if test="not(@id)">
                         <xsl:value-of select="name()"/>
                    </xsl:if>
                    <xsl:value-of select="./@id"/>
                    <xsl:text> </xsl:text>
               </xsl:for-each>
          </td>
     </tr>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

В этом примере использовались все оси.

Преобразование 1

Исходный XML
<source>

<doc>
     <ancprec>
          <p>Preceeding Ancestor.
               <br/>
          </p>
     </ancprec>
     <gf>
          <p>Ancestor.
               <br/>
          </p>
          <pprec choice="a">
               <p>Preceeding Parent.
                    <br/>
               </p>
          </pprec>
          <par>
               <p>Parent.
                    <br/>
               </p>
               <sibprec>
                    <p>Preceeding sibling.
                         <br/>
                    </p>
               </sibprec>
               <me id="id001">
                    <p>Me.
                         <br/>
                    </p>
                    <chprec>
                         <p>Preceeding child.
                              <br/>
                         </p>
                    </chprec>
                    <child idref="id001">
                         <p>Child.
                              <br/>
                         </p>
                         <dprec>
                              <p>preceeding Descendant.
                                   <br/>
                              </p>
                         </dprec>
                         <desc>
                              <p>Descendant.
                                   <br/>
                              </p>
                         </desc>
                         <dfoll>
                              <p>Following Descendant.
                                   <br/>
                              </p>
                         </dfoll>
                    </child>
                    <chfoll>
                         <p>following child.
                              <br/>
                         </p>
                    </chfoll>
               </me>
               <sibfoll>
                    <p>Following Sibling.
                         <br/>
                    </p>
               </sibfoll>
          </par>
          <pfoll>
               <p>Following Parent.
                    <br/>
               </p>
          </pfoll>
     </gf>
     <ancfoll>
          <p>following Ancestor.
               <br/>
          </p>
     </ancfoll>
</doc>

</source>

Результат
<html>
  <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

     <title>Document</title>
  </head>
  <body>
     <H2>Following Axis</H2><b>Following Sibling.<br> Following Parent.<br> following Ancestor.<br></b><H2>Descendant or Self Axis</H2><b>Me.<br> Preceeding child.<br> Child. <br>preceeding Descendant.<br> Descendant.<br> Following Descendant.<br> following child.<br> </b><H2>Descendant  Axis</H2><b>Preceeding child.<br> Child. <br>preceeding Descendant.<br> Descendant.<br> Following Descendant.<br> following child.<br> </b><H2>Self Axis</H2><b>Me.<br> </b><H2>Child Axis</H2><b>Preceeding child.<br> Child. <br>following child.<br> </b><H2>Following Axis</H2>
     <p><b>Following Sibling.<br> Following Parent.<br> following Ancestor.<br></b><br><i>Note the lack of ancestors here? <br>Learned anything
           about document order yet?</i></p>
     <H2>Following Sibling Axis</H2><b>
           Following Sibling.<br>
         </b><H2>Attribute Axis</H2><b>id001</b><H2>Parent Axis</H2><b>Parent. <br></b><H2>Ancestor or Self  Axis</H2><b>Ancestor. <br>Parent. <br>Me.<br> </b><H2>Ancestor  Axis</H2><b>Ancestor. <br>Parent. <br></b><H2>Preceding Sibling Axis</H2><b>Preceeding sibling.<br> </b><H2>Preceeding Axis</H2><b><i>Not Implemented in XT 22 09 99</i></b><H2>Namespace Axis</H2><b><i>Not Implemented in XT 22 09 99</i></b></body>
</html>

Представление HTML
Document

Following Axis

Following Sibling.
Following Parent.
following Ancestor.

Descendant or Self Axis

Me.
Preceeding child.
Child.
preceeding Descendant.
Descendant.
Following Descendant.
following child.

Descendant Axis

Preceeding child.
Child.
preceeding Descendant.
Descendant.
Following Descendant.
following child.

Self Axis

Me.

Child Axis

Preceeding child.
Child.
following child.

Following Axis

Following Sibling.
Following Parent.
following Ancestor.

Note the lack of ancestors here?
Learned anything about document order yet?

Following Sibling Axis

Following Sibling.

Attribute Axis

id001

Parent Axis

Parent.

Ancestor or Self Axis

Ancestor.
Parent.
Me.

Ancestor Axis

Ancestor.
Parent.

Preceding Sibling Axis

Preceeding sibling.

Preceeding Axis

Not Implemented in XT 22 09 99

Namespace Axis

Not Implemented in XT 22 09 99
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="//me"/>
</xsl:template>

<xsl:template match="br">
     <br/>
</xsl:template>

<xsl:template match="me" priority="10">
     <html>
          <head>
               <title>
                    <xsl:text>Document</xsl:text>
               </title>
          </head>
          <body>
               <H2>Following Axis</H2>
               <b>
                    <xsl:apply-templates select="following::*/p"/>
               </b>
               <H2>Descendant or Self Axis</H2>
               <b>
                    <xsl:apply-templates select="descendant-or-self::*/p"/>
               </b>
               <H2>Descendant Axis</H2>
               <b>
                    <xsl:apply-templates select="descendant::*/p"/>
               </b>
               <H2>Self Axis</H2>
               <b>
                    <xsl:apply-templates select="self::*/p"/>
               </b>
               <H2>Child Axis</H2>
               <b>
                    <xsl:apply-templates select="child::*/p"/>
               </b>
               <H2>Following Axis</H2>
               <p>
                    <b>
                         <xsl:apply-templates select="following::*/p"/>
                    </b>
                    <br/>
                    <i>Note the lack of ancestors here?
                         <br/>Learned anything about document order yet?
                    </i>
               </p>
               <H2>Following Sibling Axis</H2>
               <b>
                    <xsl:apply-templates select="following-sibling::*"/>
               </b>
               <H2>Attribute Axis</H2>
               <b>
                    <xsl:apply-templates select="attribute::*"/>
               </b>
               <H2>Parent Axis</H2>
               <b>
                    <xsl:apply-templates select="parent::*/p"/>
               </b>
               <H2>Ancestor or Self Axis</H2>
               <b>
                    <xsl:apply-templates select="ancestor-or-self::*/p"/>
               </b>
               <H2>Ancestor Axis</H2>
               <b>
                    <xsl:apply-templates select="ancestor::*/p"/>
               </b>
               <H2>Preceding Sibling Axis</H2>
               <b>
                    <xsl:apply-templates select="preceding-sibling::*/p"/>
               </b>
               <H2>Preceeding Axis</H2>
               <b>
                    <i>Not Implemented in XT 22 09 99</i>
               </b>
               <H2>Namespace Axis</H2>
               <b>
                    <i>Not Implemented in XT 22 09 99</i>
               </b>
          </body>
     </html>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Ось child:: может быть опущена в пути адресации, так как она является осью по умолчанию. Ось attribute:: можно кратко записать в виде @. // является сокращением для /descendant-or-self::, . является синомимом для self::, а .. является сокращением для parent::.

Преобразование 1

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<H3>AAA a1</H3>
<TABLE border="1">
  <TR>
     <TH>full</TH>
     <TH>abbreviated</TH>
  </TR>
  <TR>
     <TD>child::BBB/attribute::id</TD>
     <TD>BBB/@id</TD>
  </TR>
  <TR>
     <TD>b1</TD>
     <TD>b1</TD>
  </TR>
</TABLE>

<H3>AAA a2</H3>
<TABLE border="1">
  <TR>
     <TH>full</TH>
     <TH>abbreviated</TH>
  </TR>
  <TR>
     <TD>child::BBB/attribute::id</TD>
     <TD>BBB/@id</TD>
  </TR>
  <TR>
     <TD>b3</TD>
     <TD>b3</TD>
  </TR>
</TABLE>

Представление HTML

AAA a1

full | abbreviated
child::BBB/attribute::id | BBB/@id
b1 | b1

AAA a2

full | abbreviated
child::BBB/attribute::id | BBB/@id
b3 | b3
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="AAA">
     <H3>
          <xsl:value-of select="name()"/>
          <xsl:text> </xsl:text>
          <xsl:value-of select="@id"/>
     </H3>
     <TABLE border="1">
          <TR>
               <TH>full</TH>
               <TH>abbreviated</TH>
          </TR>
          <TR>
               <TD>
                    <xsl:text>child::BBB/attribute::id</xsl:text>
               </TD>
               <TD>
                    <xsl:text>BBB/@id</xsl:text>
               </TD>
          </TR>
          <TR>
               <TD>
                    <xsl:value-of select="child::BBB/attribute::id"/>
               </TD>
               <TD>
                    <xsl:value-of select="BBB/@id"/>
               </TD>
          </TR>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<H3>BBB b1</H3>
<TABLE border="1">
  <TR>
     <TH>full</TH>
     <TH>abbreviated</TH>
  </TR>
  <TR>
     <TD>parent::*/attribute::id</TD>
     <TD>../@id</TD>
  </TR>
  <TR>
     <TD>a1</TD>
     <TD>a1</TD>
  </TR>
</TABLE>

<H3>BBB b2</H3>
<TABLE border="1">
  <TR>
     <TH>full</TH>
     <TH>abbreviated</TH>
  </TR>
  <TR>
     <TD>parent::*/attribute::id</TD>
     <TD>../@id</TD>
  </TR>
  <TR>
     <TD>a1</TD>
     <TD>a1</TD>
  </TR>
</TABLE>

<H3>BBB b3</H3>
<TABLE border="1">
  <TR>
     <TH>full</TH>
     <TH>abbreviated</TH>
  </TR>
  <TR>
     <TD>parent::*/attribute::id</TD>
     <TD>../@id</TD>
  </TR>
  <TR>
     <TD>a2</TD>
     <TD>a2</TD>
  </TR>
</TABLE>

<H3>BBB b4</H3>
<TABLE border="1">
  <TR>
     <TH>full</TH>
     <TH>abbreviated</TH>
  </TR>
  <TR>
     <TD>parent::*/attribute::id</TD>
     <TD>../@id</TD>
  </TR>
  <TR>
     <TD>a2</TD>
     <TD>a2</TD>
  </TR>
</TABLE>

<H3>BBB b5</H3>
<TABLE border="1">
  <TR>
     <TH>full</TH>
     <TH>abbreviated</TH>
  </TR>
  <TR>
     <TD>parent::*/attribute::id</TD>
     <TD>../@id</TD>
  </TR>
  <TR>
     <TD>a2</TD>
     <TD>a2</TD>
  </TR>
</TABLE>

Представление HTML

BBB b1

full | abbreviated
parent::*/attribute::id | ../@id
a1 | a1

BBB b2

full | abbreviated
parent::*/attribute::id | ../@id
a1 | a1

BBB b3

full | abbreviated
parent::*/attribute::id | ../@id
a2 | a2

BBB b4

full | abbreviated
parent::*/attribute::id | ../@id
a2 | a2

BBB b5

full | abbreviated
parent::*/attribute::id | ../@id
a2 | a2
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="BBB">
     <H3>
          <xsl:value-of select="name()"/>
          <xsl:text> </xsl:text>
          <xsl:value-of select="@id"/>
     </H3>
     <TABLE border="1">
          <TR>
               <TH>full</TH>
               <TH>abbreviated</TH>
          </TR>
          <TR>
               <TD>
                    <xsl:text>parent::*/attribute::id</xsl:text>
               </TD>
               <TD>
                    <xsl:text>../@id</xsl:text>
               </TD>
          </TR>
          <TR>
               <TD>
                    <xsl:value-of select="parent::*/attribute::id"/>
               </TD>
               <TD>
                    <xsl:value-of select="../@id"/>
               </TD>
          </TR>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<H3>CCC c1</H3>
<TABLE border="1">
  <TR>
     <TH>full</TH>
     <TH>abbreviated</TH>
  </TR>
  <TR>
     <TD>name(/descendant-or-self::*)</TD>
     <TD>name(//*)</TD>
  </TR>
  <TR>
     <TD>source</TD>
     <TD>source</TD>
  </TR>
</TABLE>

<H3>CCC c2</H3>
<TABLE border="1">
  <TR>
     <TH>full</TH>
     <TH>abbreviated</TH>
  </TR>
  <TR>
     <TD>name(/descendant-or-self::*)</TD>
     <TD>name(//*)</TD>
  </TR>
  <TR>
     <TD>source</TD>
     <TD>source</TD>
  </TR>
</TABLE>

<H3>CCC c3</H3>
<TABLE border="1">
  <TR>
     <TH>full</TH>
     <TH>abbreviated</TH>
  </TR>
  <TR>
     <TD>name(/descendant-or-self::*)</TD>
     <TD>name(//*)</TD>
  </TR>
  <TR>
     <TD>source</TD>
     <TD>source</TD>
  </TR>
</TABLE>

Представление HTML

CCC c1

full | abbreviated
name(/descendant-or-self::*) | name(//*)
source | source

CCC c2

full | abbreviated
name(/descendant-or-self::*) | name(//*)
source | source

CCC c3

full | abbreviated
name(/descendant-or-self::*) | name(//*)
source | source
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="CCC">
     <H3>
          <xsl:value-of select="name()"/>
          <xsl:text> </xsl:text>
          <xsl:value-of select="@id"/>
     </H3>
     <TABLE border="1">
          <TR>
               <TH>full</TH>
               <TH>abbreviated</TH>
          </TR>
          <TR>
               <TD>
                    <xsl:text>name(/descendant-or-self::*)</xsl:text>
               </TD>
               <TD>
                    <xsl:text>name(//*)</xsl:text>
               </TD>
          </TR>
          <TR>
               <TD>
                    <xsl:value-of select="name(/descendant-or-self::*)"/>
               </TD>
               <TD>
                    <xsl:value-of select="name(//*)"/>
               </TD>
          </TR>
     </TABLE>
     <xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Инструкция xsl:for-each определяет шаблон, который применяется для каждого узла, выбранного с помощью атрибута select.

Преобразование 1

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <DDD id="d1"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c2"/>
     </BBB>
</AAA>

</source>

Результат
<DIV style="color:red">BBB id=b1</DIV>
<DIV style="color:red">BBB id=b2</DIV>
<DIV style="color:red">BBB id=b3</DIV>
<DIV style="color:red">BBB id=b4</DIV>
<DIV style="color:red">BBB id=b5</DIV>
<DIV style="color:navy">CCC id=c1</DIV>

Представление HTML
BBB id=b1
BBB id=b2
BBB id=b3
BBB id=b4
BBB id=b5
CCC id=c1
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:for-each select="//BBB">
          <DIV style="color:red">
               <xsl:value-of select="name()"/>
               <xsl:text> id=</xsl:text>
               <xsl:value-of select="@id"/>
          </DIV>
     </xsl:for-each>
     <xsl:for-each select="source/AAA/CCC">
          <DIV style="color:navy">
               <xsl:value-of select="name()"/>
               <xsl:text> id=</xsl:text>
               <xsl:value-of select="@id"/>
          </DIV>
     </xsl:for-each>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Узлы, выбранные с помощью xsl:for-each (преобразование 1 и преобразование 2) или xsl:apply-templates (преобразование 3) можно отсортировать. Порядок сортировки определяется атрибутом order. В преобразовании 1 проводится сортировка по возрастанию, а в преобразовании 2 — по убыванию.

Преобразование 1

Исходный XML
<source>

<name>John</name>
<name>Josua</name>
<name>Charles</name>
<name>Alice</name>
<name>Martha</name>
<name>George</name>

</source>

Результат
<TABLE>
  <TR>
     <TH>Alice</TH>
  </TR>
  <TR>
     <TH>Charles</TH>
  </TR>
  <TR>
     <TH>George</TH>
  </TR>
  <TR>
     <TH>John</TH>
  </TR>
  <TR>
     <TH>Josua</TH>
  </TR>
  <TR>
     <TH>Martha</TH>
  </TR>
</TABLE>

Представление HTML
Alice
Charles
George
John
Josua
Martha
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//name">
               <xsl:sort order="ascending" select="."/>
               <TR>
                    <TH>
                         <xsl:value-of select="."/>
                    </TH>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<name>John</name>
<name>Josua</name>
<name>Charles</name>
<name>Alice</name>
<name>Martha</name>
<name>George</name>

</source>

Результат
<TABLE>
  <TR>
     <TH>Martha</TH>
  </TR>
  <TR>
     <TH>Josua</TH>
  </TR>
  <TR>
     <TH>John</TH>
  </TR>
  <TR>
     <TH>George</TH>
  </TR>
  <TR>
     <TH>Charles</TH>
  </TR>
  <TR>
     <TH>Alice</TH>
  </TR>
</TABLE>

Представление HTML
Martha
Josua
John
George
Charles
Alice
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//name">
               <xsl:sort order="descending" select="."/>
               <TR>
                    <TH>
                         <xsl:value-of select="."/>
                    </TH>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<source>

<name>John</name>
<name>Josua</name>
<name>Charles</name>
<name>Alice</name>
<name>Martha</name>
<name>George</name>

</source>

Результат
<TABLE>
  <TR>
     <TH>Martha</TH>
  </TR>
  <TR>
     <TH>Josua</TH>
  </TR>
  <TR>
     <TH>John</TH>
  </TR>
  <TR>
     <TH>George</TH>
  </TR>
  <TR>
     <TH>Charles</TH>
  </TR>
  <TR>
     <TH>Alice</TH>
  </TR>
</TABLE>

Представление HTML
Martha
Josua
John
George
Charles
Alice
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:apply-templates select="//name">
               <xsl:sort order="descending" select="."/>
          </xsl:apply-templates>
     </TABLE>
</xsl:template>

<xsl:template match="name">
     <TR>
          <TH>
               <xsl:value-of select="."/>
          </TH>
     </TR>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

В преобразовании 1 сортировка проводится в текстовом режиме, а в преобразовании 2 — в числовом. Обратите внимание на важную деталь. В алфавите 2 идет после 1, поэтому в текстовом режиме 2 идет после 10.

Преобразование 1

Исходный XML
<source>

<car id="11"/>
<car id="6"/>
<car id="105"/>
<car id="28"/>
<car id="9"/>

</source>

Результат
<TABLE>
  <TR>
     <TH>Car-105</TH>
  </TR>
  <TR>
     <TH>Car-11</TH>
  </TR>
  <TR>
     <TH>Car-28</TH>
  </TR>
  <TR>
     <TH>Car-6</TH>
  </TR>
  <TR>
     <TH>Car-9</TH>
  </TR>
</TABLE>

Представление HTML
Car-105
Car-11
Car-28
Car-6
Car-9
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//car">
               <xsl:sort data-type="text" select="@id"/>
               <TR>
                    <TH>
                         <xsl:text>Car-</xsl:text>
                         <xsl:value-of select="@id"/>
                    </TH>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<car id="11"/>
<car id="6"/>
<car id="105"/>
<car id="28"/>
<car id="9"/>

</source>

Результат
<TABLE>
  <TR>
     <TH>Car-6</TH>
  </TR>
  <TR>
     <TH>Car-9</TH>
  </TR>
  <TR>
     <TH>Car-11</TH>
  </TR>
  <TR>
     <TH>Car-28</TH>
  </TR>
  <TR>
     <TH>Car-105</TH>
  </TR>
</TABLE>

Представление HTML
Car-6
Car-9
Car-11
Car-28
Car-105
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//car">
               <xsl:sort data-type="number" select="@id"/>
               <TR>
                    <TH>
                         <xsl:text>Car-</xsl:text>
                         <xsl:value-of select="@id"/>
                    </TH>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

В преобразовании 1 при сортировке первыми идут символы верхнего регистра, а в преобразовании 2 — нижнего регистра.

Преобразование 1

Исходный XML
<source>

<word id="czech"/>
<word id="Czech"/>
<word id="cook"/>
<word id="TooK"/>
<word id="took"/>
<word id="Took"/>

</source>

Результат
<TABLE>
  <TR>
     <TH>cook</TH>
  </TR>
  <TR>
     <TH>Czech</TH>
  </TR>
  <TR>
     <TH>czech</TH>
  </TR>
  <TR>
     <TH>TooK</TH>
  </TR>
  <TR>
     <TH>Took</TH>
  </TR>
  <TR>
     <TH>took</TH>
  </TR>
</TABLE>

Представление HTML
cook
Czech
czech
TooK
Took
took
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//word">
               <xsl:sort case-order="upper-first" select="@id"/>
               <TR>
                    <TH>
                         <xsl:value-of select="@id"/>
                    </TH>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<word id="czech"/>
<word id="Czech"/>
<word id="cook"/>
<word id="TooK"/>
<word id="took"/>
<word id="Took"/>

</source>

Результат
<TABLE>
  <TR>
     <TH>cook</TH>
  </TR>
  <TR>
     <TH>czech</TH>
  </TR>
  <TR>
     <TH>Czech</TH>
  </TR>
  <TR>
     <TH>took</TH>
  </TR>
  <TR>
     <TH>Took</TH>
  </TR>
  <TR>
     <TH>TooK</TH>
  </TR>
</TABLE>

Представление HTML
cook
czech
Czech
took
Took
TooK
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//word">
               <xsl:sort case-order="lower-first" select="@id"/>
               <TR>
                    <TH>
                         <xsl:value-of select="@id"/>
                    </TH>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

С помощью xsl:element в процессе обработки можно создавать новые элементы. В преобразовании 1 используется эта возможность, в то время как в преобразовании 2 точно такой же результат достигается другим, более трудоемким способом.

Преобразование 1

Исходный XML
<source>

<text size="H1">Header1</text>
<text size="H3">Header3</text>
<text size="b">Bold text</text>
<text size="sub">Subscript</text>
<text size="sup">Superscript</text>

</source>

Результат
<H1>Header1</H1>
<H3>Header3</H3>
<b>Bold text</b>
<sub>Subscript</sub>
<sup>Superscript</sup>

Представление HTML

Header1

Header3

Bold text Subscript Superscript
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:for-each select="//text">
          <xsl:element name="{@size}">
               <xsl:value-of select="."/>
          </xsl:element>
     </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<text size="H1">Header1</text>
<text size="H3">Header3</text>
<text size="b">Bold text</text>
<text size="sub">Subscript</text>
<text size="sup">Superscript</text>

</source>

Результат
<H1>Header1</H1>
<H3>Header3</H3>
<b>Bold text</b>
<sub>Subscript</sub>
<sup>Superscript</sup>

Представление HTML

Header1

Header3

Bold text Subscript Superscript
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:for-each select="//text">
          <xsl:choose>
               <xsl:when test='@size="H1"'>
                    <H1>
                         <xsl:value-of select="."/>
                    </H1>
               </xsl:when>
               <xsl:when test='@size="H3"'>
                    <H3>
                         <xsl:value-of select="."/>
                    </H3>
               </xsl:when>
               <xsl:when test='@size="b"'>
                    <b>
                         <xsl:value-of select="."/>
                    </b>
               </xsl:when>
               <xsl:when test='@size="sub"'>
                    <sub>
                         <xsl:value-of select="."/>
                    </sub>
               </xsl:when>
               <xsl:when test='@size="sup"'>
                    <sup>
                         <xsl:value-of select="."/>
                    </sup>
               </xsl:when>
          </xsl:choose>
     </xsl:for-each>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Инструкция xsl:attribute также служит для генерирования элементов в процессе обработки. Она предназначена для создания атрибутов элемента, в который она заключена.

Преобразование 1

Исходный XML
<source>

<color>blue</color>
<color>navy</color>
<color>green</color>
<color>lime</color>
<color>red</color>

</source>

Результат
<TABLE>
  <TR>
     <TD style="color:blue">blue</TD>
  </TR>
</TABLE>

<TABLE>
  <TR>
     <TD style="color:navy">navy</TD>
  </TR>
</TABLE>

<TABLE>
  <TR>
     <TD style="color:green">green</TD>
  </TR>
</TABLE>

<TABLE>
  <TR>
     <TD style="color:lime">lime</TD>
  </TR>
</TABLE>

<TABLE>
  <TR>
     <TD style="color:red">red</TD>
  </TR>
</TABLE>

Представление HTML
blue
navy
green
lime
red
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="color">
     <TABLE>
          <TR>
               <TD>
                    <xsl:attribute name="style">
                         <xsl:text>color:</xsl:text>
                         <xsl:value-of select="."/>
                    </xsl:attribute>
                    <xsl:value-of select="."/>
               </TD>
          </TR>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Инструкции copy и copy-of используются для копирования узлов в результирующее дерево. Инструкция copy копирует только текущий узел без дочерних элементов и атрибутов, в то время как copy-of — все.

Преобразование 1

Исходный XML
<source>

<p id="a12"> Compare
     <B>these constructs</B>.
</p>

</source>

Результат
<DIV>
  <B>copy-of : </B>
  <p id="a12">
Compare <B>these constructs</B>.
</p>
</DIV>
<DIV>
  <B>copy : </B>
  <p/>
</DIV>
<DIV>
  <B>value-of : </B>
Compare these constructs.
</DIV>

Представление HTML
copy-of :

Compare these constructs.

copy :

value-of : Compare these constructs.
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="p">
     <DIV>
          <B>
               <xsl:text>copy-of : </xsl:text>
          </B>
          <xsl:copy-of select="."/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>copy : </xsl:text>
          </B>
          <xsl:copy/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>value-of : </xsl:text>
          </B>
          <xsl:value-of select="."/>
     </DIV>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Элемент xsl:copy может иметь атрибут use-attribute-sets. В этом случае можно определить атрибуты для копируемого элемента. Преобразование 2 не будет выполняться, как ожидалось (установка use-attribute-sets при помощи функции name), так как выражения в атрибутах, относящиеся к именованным XSLT-объектам не могут быть вычислены.

Преобразование 1

Исходный XML
<source>

<h1>GREETING</h1>
<p>Hello, world!</p>

</source>

Результат
<h1 align="center" style="color:red">GREETING</h1>
<p align="left" style="color:blue">Hello, world!</p>

Представление HTML

GREETING

Hello, world!
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="/source/*"/>
</xsl:template>

<xsl:template match="h1">
     <xsl:copy use-attribute-sets="H1">
          <xsl:value-of select="."/>
     </xsl:copy>
</xsl:template>

<xsl:template match="p">
     <xsl:copy use-attribute-sets="P ">
          <xsl:value-of select="."/>
     </xsl:copy>
</xsl:template>

<xsl:attribute-set name="H1">
     <xsl:attribute name="align">center</xsl:attribute>
     <xsl:attribute name="style">color:red</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="P">
     <xsl:attribute name="align">left</xsl:attribute>
     <xsl:attribute name="style">color:blue</xsl:attribute>
</xsl:attribute-set>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<h1>GREETING</h1>
<p>Hello, world!</p>

</source>

Результат
Failed to compile stylesheet. 1 error detected.

Представление HTML
Failed to compile stylesheet. 1 error detected.
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="/source/*"/>
</xsl:template>

<xsl:template match="*">
     <xsl:copy use-attribute-sets="{name(.)}">
          <xsl:value-of select="."/>
     </xsl:copy>
</xsl:template>

<xsl:attribute-set name="H1">
     <xsl:attribute name="align">center</xsl:attribute>
     <xsl:attribute name="style">color:red</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="P">
     <xsl:attribute name="align">left</xsl:attribute>
     <xsl:attribute name="style">color:blue</xsl:attribute>
</xsl:attribute-set>

</xsl:stylesheet>


XSLT в примерах

Инструкция xsl:if позволяет реализовывать условные конструкции. Преобразование 1 демонстрирует типичный случай использования инструкции xsl:for-each, добавляя текст между отдельными компонентами. Однако, зачастую вы не захотите добавлять текст после последнего элемента. Здесь вам может помочь инструкция xsl-if (преобразование 2).

Преобразование 1

Исходный XML
<source>

<list>
     <entry name="A"/>
     <entry name="B"/>
     <entry name="C"/>
     <entry name="D"/>
</list>

</source>

Результат
A, B, C, D,

Представление HTML
A, B, C, D,
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="list">
     <xsl:for-each select="entry">
          <xsl:value-of select="@name"/>
          <xsl:text>, </xsl:text>
     </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<list>
     <entry name="A"/>
     <entry name="B"/>
     <entry name="C"/>
     <entry name="D"/>
</list>

</source>

Результат
A, B, C, D

Представление HTML
A, B, C, D
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="list">
     <xsl:for-each select="entry">
          <xsl:value-of select="@name"/>
          <xsl:if test="not (position()=last())">
               <xsl:text>, </xsl:text>
          </xsl:if>
     </xsl:for-each>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Элемент xsl:choose используется для организации выбора между несколькими возможностями.

Преобразование 1

Исходный XML
<source>

<SECTION>
     <DATA>I need a pen.</DATA>
     <DATA>I need some paper.</DATA>
     <SUMMARY>I need a pen and some paper</SUMMARY>
</SECTION>
<SECTION>
     <DATA>I need bread.</DATA>
     <DATA>I need butter.</DATA>
</SECTION>

</source>

Результат
<P>SUMMARY: I need a pen and some paper</P>

<P>DATA: I need bread.</P>
<P>DATA: I need butter.</P>

Представление HTML

SUMMARY: I need a pen and some paper

DATA: I need bread.

DATA: I need butter.
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="//SECTION">
     <xsl:choose>
          <xsl:when test="SUMMARY">
               <P>
                    <xsl:text>SUMMARY: </xsl:text>
                    <xsl:value-of select="SUMMARY"/>
               </P>
          </xsl:when>
          <xsl:otherwise>
               <xsl:for-each select="DATA">
                    <P>
                         <xsl:text>DATA: </xsl:text>
                         <xsl:value-of select="."/>
                    </P>
               </xsl:for-each>
          </xsl:otherwise>
     </xsl:choose>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Как выяснить, что некоторый текст начинается с цифры.

Преобразование 1

Исходный XML
<source>

<value>125</value>
<value>3aacc</value>
<value>qa111</value>
<value>9-12-45</value>
<value>Q6-88</value>
<value>5-ACD</value>

</source>

Результат
<P>125 (the text starts with a number)</P>
<P>3aacc (the text starts with a number)</P>
<P>qa111</P>
<P>9-12-45 (the text starts with a number)</P>
<P>Q6-88</P>
<P>5-ACD (the text starts with a number)</P>

Представление HTML

125 (the text starts with a number)

3aacc (the text starts with a number)

qa111

9-12-45 (the text starts with a number)

Q6-88

5-ACD (the text starts with a number)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="//value"/>
</xsl:template>

<xsl:template match="value">
     <P>
          <xsl:value-of select="."/>
          <xsl:if test="starts-with(translate(., '0123456789', '9999999999'), '9')">
               <xsl:text> (the text starts with a number)</xsl:text>
          </xsl:if>
     </P>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Преобразование 1 демонстрирует поведение по умолчанию элемента xsl:number. Нумерация конкретных разделов зависит от позиции элемента chapter. Нумерация на каждом уровне идет независимо. Установка атрибута level равным значению "multiple" в преобразовании 2 позволяет осуществить более естественную нумерацию.

Преобразование 1

Исходный XML
<source>

<chapter>First Chapter</chapter>
<chapter>Second Chapter
     <chapter>Subchapter 1</chapter>
     <chapter>Subchapter 2</chapter>
</chapter>
<chapter>Third Chapter
     <chapter>Subchapter A</chapter>
     <chapter>Subchapter B
          <chapter>sub a</chapter>
          <chapter>sub b</chapter>
     </chapter>
     <chapter>Subchapter C</chapter>
</chapter>

</source>

Результат
<TABLE BORDER="1">
  <TR>
     <TH>Number</TH>
     <TH>text</TH>
  </TR>
  <TR>
     <TD>1</TD>
     <TD>First Chapter</TD>
  </TR>
  <TR>
     <TD>2</TD>
     <TD>Second Chapter
</TD>
  </TR>
  <TR>
     <TD>1</TD>
     <TD>Subchapter 1</TD>
  </TR>
  <TR>
     <TD>2</TD>
     <TD>Subchapter 2</TD>
  </TR>
  <TR>
     <TD>3</TD>
     <TD>Third Chapter
</TD>
  </TR>
  <TR>
     <TD>1</TD>
     <TD>Subchapter A</TD>
  </TR>
  <TR>
     <TD>2</TD>
     <TD>Subchapter B
</TD>
  </TR>
  <TR>
     <TD>1</TD>
     <TD>sub a</TD>
  </TR>
  <TR>
     <TD>2</TD>
     <TD>sub b</TD>
  </TR>
  <TR>
     <TD>3</TD>
     <TD>Subchapter C</TD>
  </TR>
</TABLE>

Представление HTML
Number | text
1 | First Chapter
2 | Second Chapter
1 | Subchapter 1
2 | Subchapter 2
3 | Third Chapter
1 | Subchapter A
2 | Subchapter B
1 | sub a
2 | sub b
3 | Subchapter C
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE BORDER="1">
          <TR>
               <TH>Number</TH>
               <TH>text</TH>
          </TR>
          <xsl:for-each select="//chapter">
               <TR>
                    <TD>
                         <xsl:number/>
                    </TD>
                    <TD>
                         <xsl:value-of select="./text()"/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<chapter>First Chapter</chapter>
<chapter>Second Chapter
     <chapter>Subchapter 1</chapter>
     <chapter>Subchapter 2</chapter>
</chapter>
<chapter>Third Chapter
     <chapter>Subchapter A</chapter>
     <chapter>Subchapter B
          <chapter>sub a</chapter>
          <chapter>sub b</chapter>
     </chapter>
     <chapter>Subchapter C</chapter>
</chapter>

</source>

Результат
<TABLE BORDER="1">
  <TR>
     <TH>Number</TH>
     <TH>text</TH>
  </TR>
  <TR>
     <TD>1</TD>
     <TD>First Chapter</TD>
  </TR>
  <TR>
     <TD>2</TD>
     <TD>Second Chapter
</TD>
  </TR>
  <TR>
     <TD>2.1</TD>
     <TD>Subchapter 1</TD>
  </TR>
  <TR>
     <TD>2.2</TD>
     <TD>Subchapter 2</TD>
  </TR>
  <TR>
     <TD>3</TD>
     <TD>Third Chapter
</TD>
  </TR>
  <TR>
     <TD>3.1</TD>
     <TD>Subchapter A</TD>
  </TR>
  <TR>
     <TD>3.2</TD>
     <TD>Subchapter B
</TD>
  </TR>
  <TR>
     <TD>3.2.1</TD>
     <TD>sub a</TD>
  </TR>
  <TR>
     <TD>3.2.2</TD>
     <TD>sub b</TD>
  </TR>
  <TR>
     <TD>3.3</TD>
     <TD>Subchapter C</TD>
  </TR>
</TABLE>

Представление HTML
Number | text
1 | First Chapter
2 | Second Chapter
2.1 | Subchapter 1
2.2 | Subchapter 2
3 | Third Chapter
3.1 | Subchapter A
3.2 | Subchapter B
3.2.1 | sub a
3.2.2 | sub b
3.3 | Subchapter C
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE BORDER="1">
          <TR>
               <TH>Number</TH>
               <TH>text</TH>
          </TR>
          <xsl:for-each select="//chapter">
               <TR>
                    <TD>
                         <xsl:number level="multiple"/>
                    </TD>
                    <TD>
                         <xsl:value-of select="./text()"/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

xsl:number вставляет отформатированные числа в выходной поток. Формат задается с помощью атрибута format. Значение атрибута начинается с идентификатора формата, сопровождаемым символами разделителей. Изучите примеры, приведенные ниже, для сравнения нотации.

Преобразование 1

Исходный XML
<source>

<n>one</n>
<n>two</n>
<n>three</n>
<n>four</n>

</source>

Результат
<TABLE>
  <TR>
     <TD>1. one</TD>
  </TR>
  <TR>
     <TD>2. two</TD>
  </TR>
  <TR>
     <TD>3. three</TD>
  </TR>
  <TR>
     <TD>4. four</TD>
  </TR>
</TABLE>

Представление HTML
1. one
2. two
3. three
4. four
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//n">
               <TR>
                    <TD>
                         <xsl:number value="position()" format="1. "/>
                         <xsl:value-of select="."/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<n>one</n>
<n>two</n>
<n>three</n>
<n>four</n>

</source>

Результат
<TABLE>
  <TR>
     <TD>001. one</TD>
  </TR>
  <TR>
     <TD>002. two</TD>
  </TR>
  <TR>
     <TD>003. three</TD>
  </TR>
  <TR>
     <TD>004. four</TD>
  </TR>
</TABLE>

Представление HTML
001. one
002. two
003. three
004. four
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//n">
               <TR>
                    <TD>
                         <xsl:number value="position()" format="001. "/>
                         <xsl:value-of select="."/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<source>

<n>one</n>
<n>two</n>
<n>three</n>
<n>four</n>

</source>

Результат
<TABLE>
  <TR>
     <TD>A   one</TD>
  </TR>
  <TR>
     <TD>B   two</TD>
  </TR>
  <TR>
     <TD>C   three</TD>
  </TR>
  <TR>
     <TD>D   four</TD>
  </TR>
</TABLE>

Представление HTML
A one
B two
C three
D four
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//n">
               <TR>
                    <TD>
                         <xsl:number value="position()" format="A "/>
                         <xsl:value-of select="."/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 4

Исходный XML
<source>

<n>one</n>
<n>two</n>
<n>three</n>
<n>four</n>

</source>

Результат
<TABLE>
  <TR>
     <TD>a# one</TD>
  </TR>
  <TR>
     <TD>b# two</TD>
  </TR>
  <TR>
     <TD>c# three</TD>
  </TR>
  <TR>
     <TD>d# four</TD>
  </TR>
</TABLE>

Представление HTML
a# one
b# two
c# three
d# four
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//n">
               <TR>
                    <TD>
                         <xsl:number value="position()" format="a# "/>
                         <xsl:value-of select="."/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 5

Исходный XML
<source>

<n>one</n>
<n>two</n>
<n>three</n>
<n>four</n>

</source>

Результат
<TABLE>
  <TR>
     <TD>i: one</TD>
  </TR>
  <TR>
     <TD>ii: two</TD>
  </TR>
  <TR>
     <TD>iii: three</TD>
  </TR>
  <TR>
     <TD>iv: four</TD>
  </TR>
</TABLE>

Представление HTML
i: one
ii: two
iii: three
iv: four
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//n">
               <TR>
                    <TD>
                         <xsl:number value="position()" format="i: "/>
                         <xsl:value-of select="."/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 6

Исходный XML
<source>

<n>one</n>
<n>two</n>
<n>three</n>
<n>four</n>

</source>

Результат
<TABLE>
  <TR>
     <TD>I... one</TD>
  </TR>
  <TR>
     <TD>II... two</TD>
  </TR>
  <TR>
     <TD>III... three</TD>
  </TR>
  <TR>
     <TD>IV... four</TD>
  </TR>
</TABLE>

Представление HTML
I... one
II... two
III... three
IV... four
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//n">
               <TR>
                    <TD>
                         <xsl:number value="position()" format="I... "/>
                         <xsl:value-of select="."/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Преобразования 1 и 2 являются примерами форматирования многоуровневых числовых конструкций.

Преобразование 1

Исходный XML
<source>

<chapter>First Chapter</chapter>
<chapter>Second Chapter
     <chapter>Subchapter 1</chapter>
     <chapter>Subchapter 2</chapter>
</chapter>
<chapter>Third Chapter
     <chapter>Subchapter A</chapter>
     <chapter>Subchapter B
          <chapter>sub a</chapter>
          <chapter>sub b</chapter>
     </chapter>
     <chapter>Subchapter C</chapter>
</chapter>

</source>

Результат
<TABLE BORDER="1">
  <TR>
     <TH>Number</TH>
     <TH>text</TH>
  </TR>
  <TR>
     <TD>1 </TD>
     <TD>First Chapter</TD>
  </TR>
  <TR>
     <TD>2 </TD>
     <TD>Second Chapter
</TD>
  </TR>
  <TR>
     <TD>2.A </TD>
     <TD>Subchapter 1</TD>
  </TR>
  <TR>
     <TD>2.B </TD>
     <TD>Subchapter 2</TD>
  </TR>
  <TR>
     <TD>3 </TD>
     <TD>Third Chapter
</TD>
  </TR>
  <TR>
     <TD>3.A </TD>
     <TD>Subchapter A</TD>
  </TR>
  <TR>
     <TD>3.B </TD>
     <TD>Subchapter B
</TD>
  </TR>
  <TR>
     <TD>3.B.a </TD>
     <TD>sub a</TD>
  </TR>
  <TR>
     <TD>3.B.b </TD>
     <TD>sub b</TD>
  </TR>
  <TR>
     <TD>3.C </TD>
     <TD>Subchapter C</TD>
  </TR>
</TABLE>

Представление HTML
Number | text
1 | First Chapter
2 | Second Chapter
2.A | Subchapter 1
2.B | Subchapter 2
3 | Third Chapter
3.A | Subchapter A
3.B | Subchapter B
3.B.a | sub a
3.B.b | sub b
3.C | Subchapter C
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE BORDER="1">
          <TR>
               <TH>Number</TH>
               <TH>text</TH>
          </TR>
          <xsl:for-each select="//chapter">
               <TR>
                    <TD>
                         <xsl:number level="multiple" format="1.A.a "/>
                    </TD>
                    <TD>
                         <xsl:value-of select="./text()"/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<chapter>First Chapter</chapter>
<chapter>Second Chapter
     <chapter>Subchapter 1</chapter>
     <chapter>Subchapter 2</chapter>
</chapter>
<chapter>Third Chapter
     <chapter>Subchapter A</chapter>
     <chapter>Subchapter B
          <chapter>sub a</chapter>
          <chapter>sub b</chapter>
     </chapter>
     <chapter>Subchapter C</chapter>
</chapter>

</source>

Результат
<TABLE BORDER="1">
  <TR>
     <TH>Number</TH>
     <TH>text</TH>
  </TR>
  <TR>
     <TD>I:</TD>
     <TD>First Chapter</TD>
  </TR>
  <TR>
     <TD>II:</TD>
     <TD>Second Chapter
</TD>
  </TR>
  <TR>
     <TD>II-1:</TD>
     <TD>Subchapter 1</TD>
  </TR>
  <TR>
     <TD>II-2:</TD>
     <TD>Subchapter 2</TD>
  </TR>
  <TR>
     <TD>III:</TD>
     <TD>Third Chapter
</TD>
  </TR>
  <TR>
     <TD>III-1:</TD>
     <TD>Subchapter A</TD>
  </TR>
  <TR>
     <TD>III-2:</TD>
     <TD>Subchapter B
</TD>
  </TR>
  <TR>
     <TD>III-2-a:</TD>
     <TD>sub a</TD>
  </TR>
  <TR>
     <TD>III-2-b:</TD>
     <TD>sub b</TD>
  </TR>
  <TR>
     <TD>III-3:</TD>
     <TD>Subchapter C</TD>
  </TR>
</TABLE>

Представление HTML
Number | text
I: | First Chapter
II: | Second Chapter
II-1: | Subchapter 1
II-2: | Subchapter 2
III: | Third Chapter
III-1: | Subchapter A
III-2: | Subchapter B
III-2-a: | sub a
III-2-b: | sub b
III-3: | Subchapter C
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE BORDER="1">
          <TR>
               <TH>Number</TH>
               <TH>text</TH>
          </TR>
          <xsl:for-each select="//chapter">
               <TR>
                    <TD>
                         <xsl:number level="multiple" format="I-1-a:"/>
                    </TD>
                    <TD>
                         <xsl:value-of select="./text()"/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

В преобразованиях 1 и 3 демонстрируются различные способы задания xsl:variable, а в преобразованиях 2 и 4 — xsl:param.

Преобразование 1

Исходный XML
<source>

<chapter>Chapter A</chapter>
<chapter>Chapter B</chapter>
<chapter>Chapter C</chapter>
<chapter>Chapter D</chapter>

</source>

Результат
<TABLE>
  <TR>
     <TD>Chapter A (1/4)</TD>
  </TR>
  <TR>
     <TD>Chapter B (2/4)</TD>
  </TR>
  <TR>
     <TD>Chapter C (3/4)</TD>
  </TR>
  <TR>
     <TD>Chapter D (4/4)</TD>
  </TR>
</TABLE>

Представление HTML
Chapter A (1/4)
Chapter B (2/4)
Chapter C (3/4)
Chapter D (4/4)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:variable name="totalChapters">
     <xsl:value-of select="count(//chapter)"/>
</xsl:variable>
<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//chapter">
               <TR>
                    <TD>
                         <xsl:value-of select="."/>
                         <xsl:text> (</xsl:text>
                         <xsl:value-of select="position()"/>
                         <xsl:text>/</xsl:text>
                         <xsl:value-of select="$totalChapters"/>
                         <xsl:text>)</xsl:text>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<chapter>Chapter A</chapter>
<chapter>Chapter B</chapter>
<chapter>Chapter C</chapter>
<chapter>Chapter D</chapter>

</source>

Результат
<TABLE>
  <TR>
     <TD>Chapter A (1/4)</TD>
  </TR>
  <TR>
     <TD>Chapter B (2/4)</TD>
  </TR>
  <TR>
     <TD>Chapter C (3/4)</TD>
  </TR>
  <TR>
     <TD>Chapter D (4/4)</TD>
  </TR>
</TABLE>

Представление HTML
Chapter A (1/4)
Chapter B (2/4)
Chapter C (3/4)
Chapter D (4/4)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:param name="totalChapters">
     <xsl:value-of select="count(//chapter)"/>
</xsl:param>
<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//chapter">
               <TR>
                    <TD>
                         <xsl:value-of select="."/>
                         <xsl:text> (</xsl:text>
                         <xsl:value-of select="position()"/>
                         <xsl:text>/</xsl:text>
                         <xsl:value-of select="$totalChapters"/>
                         <xsl:text>)</xsl:text>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<source>

<chapter>Chapter A</chapter>
<chapter>Chapter B</chapter>
<chapter>Chapter C</chapter>
<chapter>Chapter D</chapter>

</source>

Результат
<TABLE>
  <TR>
     <TD>Chapter A (1/4)</TD>
  </TR>
  <TR>
     <TD>Chapter B (2/4)</TD>
  </TR>
  <TR>
     <TD>Chapter C (3/4)</TD>
  </TR>
  <TR>
     <TD>Chapter D (4/4)</TD>
  </TR>
</TABLE>

Представление HTML
Chapter A (1/4)
Chapter B (2/4)
Chapter C (3/4)
Chapter D (4/4)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:variable name="totalChapters" select="count(//chapter)"/>
<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//chapter">
               <TR>
                    <TD>
                         <xsl:value-of select="."/>
                         <xsl:text> (</xsl:text>
                         <xsl:value-of select="position()"/>
                         <xsl:text>/</xsl:text>
                         <xsl:value-of select="$totalChapters"/>
                         <xsl:text>)</xsl:text>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 4

Исходный XML
<source>

<chapter>Chapter A</chapter>
<chapter>Chapter B</chapter>
<chapter>Chapter C</chapter>
<chapter>Chapter D</chapter>

</source>

Результат
<TABLE>
  <TR>
     <TD>Chapter A (1/4)</TD>
  </TR>
  <TR>
     <TD>Chapter B (2/4)</TD>
  </TR>
  <TR>
     <TD>Chapter C (3/4)</TD>
  </TR>
  <TR>
     <TD>Chapter D (4/4)</TD>
  </TR>
</TABLE>

Представление HTML
Chapter A (1/4)
Chapter B (2/4)
Chapter C (3/4)
Chapter D (4/4)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:param name="totalChapters" select="count(//chapter)"/>
<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//chapter">
               <TR>
                    <TD>
                         <xsl:value-of select="."/>
                         <xsl:text> (</xsl:text>
                         <xsl:value-of select="position()"/>
                         <xsl:text>/</xsl:text>
                         <xsl:value-of select="$totalChapters"/>
                         <xsl:text>)</xsl:text>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Преобразование может содержать несколько переменных с одинаковыми именами. В преобразовании 1 демонстрируется способ, как возвращать значение глобальной переменной, которая имеет такое же имя, как и локальная. В преобразовании 2 демонстрируется неверный вариант. Область видимости локальной переменной ограничивается элементом xsl:when. Поэтому в остальной части шаблона видима только глобальная переменная.

Преобразование 1

Исходный XML
<source>

<chapter>Chapter A</chapter>
<chapter>Chapter B</chapter>
<chapter>Chapter C</chapter>
<chapter>Chapter D</chapter>

</source>

Результат
<TABLE>
  <TR>
     <TD>First chapter : Chapter A</TD>
  </TR>
  <TR>
     <TD>Chapter : Chapter B</TD>
  </TR>
  <TR>
     <TD>Chapter : Chapter C</TD>
  </TR>
  <TR>
     <TD>Last chapter : Chapter D</TD>
  </TR>
</TABLE>

Представление HTML
First chapter : Chapter A
Chapter : Chapter B
Chapter : Chapter C
Last chapter : Chapter D
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:variable name="text">Chapter</xsl:variable>
<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//chapter">
               <TR>
                    <TD>
                         <xsl:variable name="text">
                              <xsl:choose>
                                   <xsl:when test="position() = 1">First chapter</xsl:when>
                                   <xsl:when test="position()=last()">Last chapter</xsl:when>
                                   <xsl:otherwise>
                                        <xsl:value-of select="$text"/>
                                   </xsl:otherwise>
                              </xsl:choose>
                         </xsl:variable>
                         <xsl:value-of select="$text"/>
                         <xsl:text> : </xsl:text>
                         <xsl:value-of select="."/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<chapter>Chapter A</chapter>
<chapter>Chapter B</chapter>
<chapter>Chapter C</chapter>
<chapter>Chapter D</chapter>

</source>

Результат
<TABLE>
  <TR>
     <TD>Chapter : Chapter A</TD>
  </TR>
  <TR>
     <TD>Chapter : Chapter B</TD>
  </TR>
  <TR>
     <TD>Chapter : Chapter C</TD>
  </TR>
  <TR>
     <TD>Chapter : Chapter D</TD>
  </TR>
</TABLE>

Представление HTML
Chapter : Chapter A
Chapter : Chapter B
Chapter : Chapter C
Chapter : Chapter D
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:variable name="text">Chapter</xsl:variable>
<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//chapter">
               <TR>
                    <TD>
                         <xsl:choose>
                              <xsl:when test="position() = 1">
                                   <xsl:variable name="text">First chapter</xsl:variable>
                              </xsl:when>
                              <xsl:when test="position()=last()">
                                   <xsl:variable name="text">Last chapter</xsl:variable>
                              </xsl:when>
                              <xsl:otherwise>
                                   <xsl:variable name="text">
                                        <xsl:value-of select="$text"/>
                                   </xsl:variable>
                              </xsl:otherwise>
                         </xsl:choose>
                         <xsl:value-of select="$text"/>
                         <xsl:text> : </xsl:text>
                         <xsl:value-of select="."/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Параметры шаблону можно передать при помощи элемента xsl:with-param. Если шаблон содержит элемент xsl:param с таким же атрибутом name, что и xsl:with-param, то его значение будет использовано. Преобразование 1 является типичным примером. Если вы хотите передать переменную, то надо определить эту переменную при помощи элемента xsl:param. Примером неправильного подхода может служить преобразование 2.

Преобразование 1

Исходный XML
<source>

<number>1</number>
<number>3</number>
<number>4</number>
<number>17</number>
<number>8</number>

</source>

Результат
<TABLE>
  <TR>
     <TH>1 (odd)</TH>
  </TR>
  <TR>
     <TH>3 (odd)</TH>
  </TR>
  <TR>
     <TH>4 (even)</TH>
  </TR>
  <TR>
     <TH>17 (odd)</TH>
  </TR>
  <TR>
     <TH>8 (even)</TH>
  </TR>
</TABLE>

Представление HTML
1 (odd)
3 (odd)
4 (even)
17 (odd)
8 (even)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//number">
               <TR>
                    <TH>
                         <xsl:choose>
                              <xsl:when test="text() mod 2">
                                   <xsl:apply-templates select=".">
                                        <xsl:with-param name="type">odd</xsl:with-param>
                                   </xsl:apply-templates>
                              </xsl:when>
                              <xsl:otherwise>
                                   <xsl:apply-templates select="."/>
                              </xsl:otherwise>
                         </xsl:choose>
                    </TH>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

<xsl:template match="number">
     <xsl:param name="type">even</xsl:param>
     <xsl:value-of select="."/>
     <xsl:text> (</xsl:text>
     <xsl:value-of select="$type"/>
     <xsl:text>)</xsl:text>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<number>1</number>
<number>3</number>
<number>4</number>
<number>17</number>
<number>8</number>

</source>

Результат
<TABLE>
  <TR>
     <TH>1 (even)</TH>
  </TR>
  <TR>
     <TH>3 (even)</TH>
  </TR>
  <TR>
     <TH>4 (even)</TH>
  </TR>
  <TR>
     <TH>17 (even)</TH>
  </TR>
  <TR>
     <TH>8 (even)</TH>
  </TR>
</TABLE>

Представление HTML
1 (even)
3 (even)
4 (even)
17 (even)
8 (even)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//number">
               <TR>
                    <TH>
                         <xsl:choose>
                              <xsl:when test="text() mod 2">
                                   <xsl:apply-templates select=".">
                                        <xsl:with-param name="type">odd</xsl:with-param>
                                   </xsl:apply-templates>
                              </xsl:when>
                              <xsl:otherwise>
                                   <xsl:apply-templates select="."/>
                              </xsl:otherwise>
                         </xsl:choose>
                    </TH>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

<xsl:template match="number">
     <xsl:variable name="type">even</xsl:variable>
     <xsl:value-of select="."/>
     <xsl:text> (</xsl:text>
     <xsl:value-of select="$type"/>
     <xsl:text>)</xsl:text>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Переменная может в качестве своего значения держать фрагмент результирующего дерева. Операции, допустимые на фрагменте результирующего дерева, являются подмножеством допустимых на множестве узлов. Операции допустимы на фрагменте результирующего дерева только, если эти операции будут допустимыми над строкой (операция над строкой может сначала вызывать преобразование строки в число или булевую переменную). В частности, на фрагменте результирующего дерева нельзя использовать операторы "/", "//" и "[]". Когда допустимая операция выполняется на фрагменте результирующего дерева, она выполняется точно так, как она должна была быть выполнена на эквивалентном множестве узлов. Сравните преобразования 1 и 2.

Преобразование 1

Исходный XML
<source>

<TABLE border="1">
     <TR>
          <TD>AAA</TD>
          <TD>BBB</TD>
     </TR>
     <TR>
          <TD>aaa</TD>
          <TD>bbb</TD>
     </TR>
</TABLE>
<TABLE border="1">
     <TR>
          <TD>1111111</TD>
     </TR>
     <TR>
          <TD>22222222</TD>
     </TR>
</TABLE>

</source>

Результат
<TABLE border="1">

  <TR>

     <TD>1111111</TD>

  </TR>

  <TR>

     <TD>22222222</TD>

  </TR>

</TABLE>
<TABLE border="1">

  <TR>

     <TD>AAA</TD>

     <TD>BBB</TD>

  </TR>

  <TR>

     <TD>aaa</TD>

     <TD>bbb</TD>

  </TR>

</TABLE>
<TABLE border="1">

  <TR>

     <TD>1111111</TD>

  </TR>

  <TR>

     <TD>22222222</TD>

  </TR>

</TABLE>

Представление HTML
1111111
22222222
AAA | BBB
aaa | bbb
1111111
22222222
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:variable name="A1">
     <xsl:copy-of select="//TABLE[1]"/>
</xsl:variable>
<xsl:variable name="A2">
     <xsl:copy-of select="//TABLE[2]"/>
</xsl:variable>
<xsl:template match="/">
     <xsl:copy-of select="$A2"/>
     <xsl:copy-of select="$A1"/>
     <xsl:copy-of select="$A2"/>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<TABLE border="1">
     <TR>
          <TD>AAA</TD>
          <TD>BBB</TD>
     </TR>
     <TR>
          <TD>aaa</TD>
          <TD>bbb</TD>
     </TR>
</TABLE>
<TABLE border="1">
     <TR>
          <TD>1111111</TD>
     </TR>
     <TR>
          <TD>22222222</TD>
     </TR>
</TABLE>

</source>

Результат
<P>

          1111111

           22222222

</P>
<P>

          AAA
           BBB

          aaa
           bbb

</P>
<P>

          1111111

           22222222

</P>

Представление HTML

1111111 22222222

AAA BBB aaa bbb

1111111 22222222

Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:variable name="A1">
     <xsl:copy-of select="//TABLE[1]"/>
</xsl:variable>
<xsl:variable name="A2">
     <xsl:copy-of select="//TABLE[2]"/>
</xsl:variable>
<xsl:template match="/">
     <P>
          <xsl:value-of select="$A2"/>
     </P>
     <P>
          <xsl:value-of select="$A1"/>
     </P>
     <P>
          <xsl:value-of select="$A2"/>
     </P>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Есть тонкий момент при задании значения переменной.

Преобразование 1

Исходный XML
<source>

<AAA>
     <BBB>
          <CCC>C1</CCC>
     </BBB>
     <CCC>C2</CCC>
     <CCC>C3</CCC>
</AAA>
<AAA>
     <CCC>
          <DDD>D1</DDD>
          <DDD>D2</DDD>
     </CCC>
</AAA>

</source>

Результат
<P>//AAA/CCC/DDD : D1</P>
<P>//AAA/CCC/text() : C2 C3

   </P>

Представление HTML

//AAA/CCC/DDD : D1

//AAA/CCC/text() : C2 C3

Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:variable name="var1" select="//AAA/CCC/text()"/>
<xsl:variable name="var2">//AAA/CCC/text()</xsl:variable>
<xsl:template match="/">
     <xsl:call-template name="function">
          <xsl:with-param name="path1" select="//AAA/CCC/DDD"/>
          <xsl:with-param name="path2">//AAA/CCC/DDD</xsl:with-param>
     </xsl:call-template>
</xsl:template>

<xsl:template name="function">
     <xsl:param name="path1"/>
     <xsl:param name="path2"/>
     <P>
          <xsl:value-of select="$path2"/>
          <xsl:text> : </xsl:text>
          <xsl:value-of select="$path1"/>
     </P>
     <P>
          <xsl:value-of select="$var2"/>
          <xsl:text> : </xsl:text>
          <xsl:for-each select="$var1">
               <xsl:value-of select="."/>
               <xsl:text> </xsl:text>
          </xsl:for-each>
     </P>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция number явным образом конвертирует свой аргумент в число. Преобразование 1 является примером конвертации строк, а преобразование 2 — примером конвертации булевских переменных true и false.

Преобразование 1

Исходный XML
<source>

<text>124</text>
<text>1 2 4</text>
<text>-16</text>
<text>- 16</text>
<text>125.258</text>
<text>125.</text>
<text>ASDF</text>
<text>A123</text>
<text>true</text>
<text>false()</text>

</source>

Результат
<TABLE border="1">
  <TR>
     <TH>text</TH>
     <TH>number</TH>
  </TR>
  <TR>
     <TD>124</TD>
     <TD>124</TD>
  </TR>
  <TR>
     <TD>1 2 4</TD>
     <TD>NaN</TD>
  </TR>
  <TR>
     <TD>-16</TD>
     <TD>-16</TD>
  </TR>
  <TR>
     <TD>- 16</TD>
     <TD>NaN</TD>
  </TR>
  <TR>
     <TD>125.258</TD>
     <TD>125.258</TD>
  </TR>
  <TR>
     <TD>125.</TD>
     <TD>125</TD>
  </TR>
  <TR>
     <TD>ASDF</TD>
     <TD>NaN</TD>
  </TR>
  <TR>
     <TD>A123</TD>
     <TD>NaN</TD>
  </TR>
  <TR>
     <TD>true</TD>
     <TD>NaN</TD>
  </TR>
  <TR>
     <TD>false()</TD>
     <TD>NaN</TD>
  </TR>
</TABLE>

Представление HTML
text | number
124 | 124
1 2 4 | NaN
-16 | -16
- 16 | NaN
125.258 | 125.258
125. | 125
ASDF | NaN
A123 | NaN
true | NaN
false() | NaN
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE border="1">
          <TR>
               <TH>text</TH>
               <TH>number</TH>
          </TR>
          <xsl:for-each select="//text">
               <TR>
                    <TD>
                         <xsl:value-of select="."/>
                    </TD>
                    <TD>
                         <xsl:value-of select="number()"/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<text>124</text>
<text>1 2 4</text>
<text>-16</text>
<text>- 16</text>
<text>125.258</text>
<text>125.</text>
<text>ASDF</text>
<text>A123</text>
<text>true</text>
<text>false()</text>

</source>

Результат
<TABLE border="1">
  <TR>
     <TH>text</TH>
     <TH>number</TH>
  </TR>
  <TR>
     <TD>true</TD>
     <TD>NaN</TD>
  </TR>
  <TR>
     <TD>false()</TD>
     <TD>NaN</TD>
  </TR>
</TABLE>
<P>but:</P>
<TABLE border="1">
  <TR>
     <TH>function</TH>
     <TH>number</TH>
  </TR>
  <TR>
     <TD>true()</TD>
     <TD>1</TD>
  </TR>
  <TR>
     <TD>false()</TD>
     <TD>0</TD>
  </TR>
  <TR>
     <TD>5&gt;7</TD>
     <TD>0</TD>
  </TR>
  <TR>
     <TD>5&lt;7</TD>
     <TD>1</TD>
  </TR>
</TABLE>

Представление HTML
text | number
true | NaN
false() | NaN

but:

function | number
true() | 1
false() | 0
5>7 | 0
5<7 | 1
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE border="1">
          <TR>
               <TH>text</TH>
               <TH>number</TH>
          </TR>
          <xsl:for-each select="//text[text() = 'true' or text() = 'false()']">
               <TR>
                    <TD>
                         <xsl:value-of select="."/>
                    </TD>
                    <TD>
                         <xsl:value-of select="number()"/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
     <P>
          <xsl:text>but:</xsl:text>
     </P>
     <TABLE border="1">
          <TR>
               <TH>function</TH>
               <TH>number</TH>
          </TR>
          <TR>
               <TD>true()</TD>
               <TD>
                    <xsl:value-of select="number(true())"/>
               </TD>
          </TR>
          <TR>
               <TD>false()</TD>
               <TD>
                    <xsl:value-of select="number(false())"/>
               </TD>
          </TR>
          <TR>
               <TD>5>7</TD>
               <TD>
                    <xsl:value-of select="number(5 > 7)"/>
               </TD>
          </TR>
          <TR>
               <TD>5<7</TD>
               <TD>
                    <xsl:value-of select="number(5<7)"/>
               </TD>
          </TR>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Сложение, вычитание и умножение осуществляется обычным способом (преобразование 1). Синтаксис для деления немного отличается от традиционного. Символ "/" зарезервирован для путей адресации и вместо него для обозначения деления используется ключевое слово div (преобразование 2). Оператор mod возвращает остаток от деления нацело (преобразование 2).

Преобразование 1

Исходный XML
<source>

<number>1</number>
<number>3</number>
<number>4</number>
<number>17</number>
<number>8</number>
<number>11</number>

</source>

Результат
<P>1 + 3 = 4</P>
<P>4 - 17 = -13</P>
<P>8 * 11 = 88</P>

Представление HTML

1 + 3 = 4

4 - 17 = -13

8 * 11 = 88
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <P>
          <xsl:value-of select="//number[1]"/>
          <xsl:text> + </xsl:text>
          <xsl:value-of select="//number[2]"/>
          <xsl:text> = </xsl:text>
          <xsl:value-of select="//number[1] + //number[2]"/>
     </P>
     <P>
          <xsl:value-of select="//number[3]"/>
          <xsl:text> - </xsl:text>
          <xsl:value-of select="//number[4]"/>
          <xsl:text> = </xsl:text>
          <xsl:value-of select="//number[3] - //number[4]"/>
     </P>
     <P>
          <xsl:value-of select="//number[5]"/>
          <xsl:text> * </xsl:text>
          <xsl:value-of select="//number[6]"/>
          <xsl:text> = </xsl:text>
          <xsl:value-of select="//number[5] * //number[6]"/>
     </P>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<number>1</number>
<number>3</number>
<number>4</number>
<number>17</number>
<number>8</number>
<number>11</number>

</source>

Результат
<P>8 / 11 = 0.7272727272727273</P>
<P>8 mod 11 = 8</P>

Представление HTML

8 / 11 = 0.7272727272727273

8 mod 11 = 8
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <P>
          <xsl:value-of select="//number[5]"/>
          <xsl:text> / </xsl:text>
          <xsl:value-of select="//number[6]"/>
          <xsl:text> = </xsl:text>
          <xsl:value-of select="//number[5] div //number[6]"/>
     </P>
     <P>
          <xsl:value-of select="//number[5]"/>
          <xsl:text> mod </xsl:text>
          <xsl:value-of select="//number[6]"/>
          <xsl:text> = </xsl:text>
          <xsl:value-of select="//number[5] mod //number[6]"/>
     </P>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция sum() суммирует все числа из выбранного множества узлов. В преобразовании 1 суммируются все числа, а в преобразовании 2 — только нечетные.

Преобразование 1

Исходный XML
<source>

<number>1</number>
<number>3</number>
<number>4</number>
<number>17</number>
<number>8</number>
<number>11</number>

</source>

Результат
1 + 3 + 4 + 17 + 8 + 11 = 44

Представление HTML
1 + 3 + 4 + 17 + 8 + 11 = 44
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:for-each select="//number">
          <xsl:value-of select="."/>
          <xsl:choose>
               <xsl:when test="position()=last()">
                    <xsl:text> = </xsl:text>
               </xsl:when>
               <xsl:otherwise>
                    <xsl:text> + </xsl:text>
               </xsl:otherwise>
          </xsl:choose>
     </xsl:for-each>
     <xsl:value-of select="sum(//number)"/>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<number>1</number>
<number>3</number>
<number>4</number>
<number>17</number>
<number>8</number>
<number>11</number>

</source>

Результат
1 + 3 + 17 + 11 = 32

Представление HTML
1 + 3 + 17 + 11 = 32
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:for-each select="//number">
          <xsl:variable name="number" select="."/>
          <xsl:if test="$number mod 2">
               <xsl:value-of select="."/>
               <xsl:choose>
                    <xsl:when test="position()=last()">
                         <xsl:text> = </xsl:text>
                    </xsl:when>
                    <xsl:otherwise>
                         <xsl:text> + </xsl:text>
                    </xsl:otherwise>
               </xsl:choose>
          </xsl:if>
     </xsl:for-each>
     <xsl:value-of select="sum(//number[text() mod 2 = true()])"/>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функции ceilng(), floor() и round() преобразуют числа с плавающей запятой в целые определенным способом.

Преобразование 1

Исходный XML
<source>

<number>6</number>
<number>3.8</number>
<number>1.234</number>
<number>-6</number>
<number>-3.8</number>
<number>-1.234</number>

</source>

Результат
<TABLE border="1">
  <TR>
     <TH>number</TH>
     <TH>floor</TH>
     <TH>ceiling</TH>
     <TH>round</TH>
  </TR>
  <TR>
     <TD>6</TD>
     <TD>6</TD>
     <TD>6</TD>
     <TD>6</TD>
  </TR>
  <TR>
     <TD>3.8</TD>
     <TD>3</TD>
     <TD>4</TD>
     <TD>4</TD>
  </TR>
  <TR>
     <TD>1.234</TD>
     <TD>1</TD>
     <TD>2</TD>
     <TD>1</TD>
  </TR>
  <TR>
     <TD>-6</TD>
     <TD>-6</TD>
     <TD>-6</TD>
     <TD>-6</TD>
  </TR>
  <TR>
     <TD>-3.8</TD>
     <TD>-4</TD>
     <TD>-3</TD>
     <TD>-4</TD>
  </TR>
  <TR>
     <TD>-1.234</TD>
     <TD>-2</TD>
     <TD>-1</TD>
     <TD>-1</TD>
  </TR>
</TABLE>

Представление HTML
number | floor | ceiling | round
6 | 6 | 6 | 6
3.8 | 3 | 4 | 4
1.234 | 1 | 2 | 1
-6 | -6 | -6 | -6
-3.8 | -4 | -3 | -4
-1.234 | -2 | -1 | -1
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE border="1">
          <TR>
               <TH>number</TH>
               <TH>floor</TH>
               <TH>ceiling</TH>
               <TH>round</TH>
          </TR>
          <xsl:for-each select="//number">
               <TR>
                    <TD>
                         <xsl:value-of select="."/>
                    </TD>
                    <TD>
                         <xsl:value-of select="floor(.)"/>
                    </TD>
                    <TD>
                         <xsl:value-of select="ceiling(.)"/>
                    </TD>
                    <TD>
                         <xsl:value-of select="round(.)"/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция string() преобразует свой аргумент к строковому типу. Эта функция обычно не используется явно в преобразованиях, так как в большинстве случаев она вызывается по умолчанию. Преобразование 1 является примером преобразования чисел к строковому типу. Обратите внимание на результат деления на 0.

Преобразование 1

Исходный XML
<source>

<number>9</number>
<number>0</number>
<number>-9</number>
<number/>

</source>

Результат
<P>9</P>
<P>NaN</P>
<P>9/0 = Infinity</P>
<P>-9/0 = -Infinity</P>
<P>0/0 = NaN</P>

Представление HTML

9

NaN

9/0 = Infinity

-9/0 = -Infinity

0/0 = NaN
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:variable name="A" select="number(//number[1])"/>
<xsl:variable name="B" select="number(//number[2])"/>
<xsl:variable name="C" select="number(//number[3])"/>
<xsl:variable name="D" select="number(//number[4])"/>
<xsl:template match="/">
     <P>
          <xsl:value-of select="string(number($A))"/>
     </P>
     <P>
          <xsl:value-of select="string(number($D))"/>
     </P>
     <P>
          <xsl:value-of select="$A"/>
          <xsl:text>/</xsl:text>
          <xsl:value-of select="$B"/>
          <xsl:text> = </xsl:text>
          <xsl:value-of select="string($A div $B)"/>
     </P>
     <P>
          <xsl:value-of select="$C"/>
          <xsl:text>/</xsl:text>
          <xsl:value-of select="$B"/>
          <xsl:text> = </xsl:text>
          <xsl:value-of select="string($C div $B)"/>
     </P>
     <P>
          <xsl:value-of select="$B"/>
          <xsl:text>/</xsl:text>
          <xsl:value-of select="$B"/>
          <xsl:text> = </xsl:text>
          <xsl:value-of select="$B div $B"/>
     </P>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Пример проверки на то, что тестовое значение является числом.

Преобразование 1

Исходный XML
<source>

<number>253</number>
<number>sd12</number>
<number>-64</number>
<number>2.25.25</number>
<number>2.25</number>

</source>

Результат
<DIV>253</DIV>

<DIV>sd12 is not a number</DIV>

<DIV>-64</DIV>

<DIV>2.25.25 is not a number</DIV>

<DIV>2.25</DIV>

Представление HTML
253
sd12 is not a number
-64
2.25.25 is not a number
2.25
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="number">
     <DIV>
          <xsl:value-of select="."/>
          <xsl:if test="string(number(.))='NaN'"> is not a number</xsl:if>
     </DIV>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

В преобразовании 1 строки являются аргументами функции boolean(). Строка является "истиной" тогда и только тогда, когда ее длина ненулевая. В преобразовании 2 текст конвертируется в числовой тип, а затем передается в качестве аргументов функции boolean(). Преобразование 3 показывает разницу между тем, когда "0" является числом, и когда — строкой. В преобразовании 4 в качестве аргумента функции boolean() используется подмножество узлов.

Преобразование 1

Исходный XML
<source>

<text>124</text>
<text>AB234</text>
<text>-16</text>
<text>0</text>
<text/>
<text>false</text>

</source>

Результат
<TABLE border="1">
  <TR>
     <TH>text</TH>
     <TH>boolean</TH>
  </TR>
  <TR>
     <TD>124 </TD>
     <TD>true</TD>
  </TR>
  <TR>
     <TD>AB234 </TD>
     <TD>true</TD>
  </TR>
  <TR>
     <TD>-16 </TD>
     <TD>true</TD>
  </TR>
  <TR>
     <TD>0 </TD>
     <TD>true</TD>
  </TR>
  <TR>
     <TD> </TD>
     <TD>false</TD>
  </TR>
  <TR>
     <TD>false </TD>
     <TD>true</TD>
  </TR>
</TABLE>

Представление HTML
text | boolean
124 | true
AB234 | true
-16 | true
0 | true
 | false
false | true
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE border="1">
          <TR>
               <TH>text</TH>
               <TH>boolean</TH>
          </TR>
          <xsl:for-each select="//text">
               <TR>
                    <TD>
                         <xsl:value-of select="."/>
                         <xsl:text> </xsl:text>
                    </TD>
                    <TD>
                         <xsl:value-of select="boolean(text())"/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<text>124</text>
<text>AB234</text>
<text>-16</text>
<text>0</text>
<text/>
<text>false</text>

</source>

Результат
<TABLE border="1">
  <TR>
     <TH>text</TH>
     <TH>number</TH>
     <TH>boolean</TH>
  </TR>
  <TR>
     <TD>124 </TD>
     <TD>124 </TD>
     <TD>true</TD>
  </TR>
  <TR>
     <TD>AB234 </TD>
     <TD>NaN </TD>
     <TD>false</TD>
  </TR>
  <TR>
     <TD>-16 </TD>
     <TD>-16 </TD>
     <TD>true</TD>
  </TR>
  <TR>
     <TD>0 </TD>
     <TD>0 </TD>
     <TD>false</TD>
  </TR>
  <TR>
     <TD> </TD>
     <TD>NaN </TD>
     <TD>false</TD>
  </TR>
  <TR>
     <TD>false </TD>
     <TD>NaN </TD>
     <TD>false</TD>
  </TR>
</TABLE>

Представление HTML
text | number | boolean
124 | 124 | true
AB234 | NaN | false
-16 | -16 | true
0 | 0 | false
 | NaN | false
false | NaN | false
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE border="1">
          <TR>
               <TH>text</TH>
               <TH>number</TH>
               <TH>boolean</TH>
          </TR>
          <xsl:for-each select="//text">
               <TR>
                    <TD>
                         <xsl:value-of select="."/>
                         <xsl:text> </xsl:text>
                    </TD>
                    <TD>
                         <xsl:value-of select="number(text())"/>
                         <xsl:text> </xsl:text>
                    </TD>
                    <TD>
                         <xsl:value-of select="boolean(number(text()))"/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<source>

<text>124</text>
<text>AB234</text>
<text>-16</text>
<text>0</text>
<text/>
<text>false</text>

</source>

Результат
<P>The boolean value of "0" is <B>true</B> if "0" is a string, but <B>false</B> if "0" is a number.</P>

Представление HTML

The boolean value of "0" is true if "0" is a string, but false if "0" is a number.
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <P>
          <xsl:text>The boolean value of "0" is </xsl:text>
          <B>
               <xsl:value-of select="boolean(//text[text()='0'])"/>
          </B>
          <xsl:text> if "0" is a string, but </xsl:text>
          <B>
               <xsl:value-of select="boolean(number((//text[text()='0'])))"/>
          </B>
          <xsl:text> if "0" is a number.</xsl:text>
     </P>
</xsl:template>

</xsl:stylesheet>

Преобразование 4

Исходный XML
<source>

<text>124</text>
<text>AB234</text>
<text>-16</text>
<text>0</text>
<text/>
<text>false</text>

</source>

Результат
<TABLE border="1">
  <TR>
     <TH>node-set</TH>
     <TH>boolean</TH>
  </TR>
  <TR>
     <TD>/</TD>
     <TD>true</TD>
  </TR>
  <TR>
     <TD>//text</TD>
     <TD>true</TD>
  </TR>
  <TR>
     <TD>//number</TD>
     <TD>false</TD>
  </TR>
  <TR>
     <TD>//text[23]</TD>
     <TD>false</TD>
  </TR>
</TABLE>

Представление HTML
node-set | boolean
/ | true
//text | true
//number | false
//text[23] | false
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE border="1">
          <TR>
               <TH>node-set</TH>
               <TH>boolean</TH>
          </TR>
          <TR>
               <TD>
                    <xsl:text>/</xsl:text>
               </TD>
               <TD>
                    <xsl:value-of select="boolean(/)"/>
               </TD>
          </TR>
          <TR>
               <TD>
                    <xsl:text>//text</xsl:text>
               </TD>
               <TD>
                    <xsl:value-of select="boolean(//text)"/>
               </TD>
          </TR>
          <TR>
               <TD>
                    <xsl:text>//number</xsl:text>
               </TD>
               <TD>
                    <xsl:value-of select="boolean(//number)"/>
               </TD>
          </TR>
          <TR>
               <TD>
                    <xsl:text>//text[23]</xsl:text>
               </TD>
               <TD>
                    <xsl:value-of select="boolean(//text[23])"/>
               </TD>
          </TR>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция not() возвращает "истину", если аргументом была "ложь", и "ложь" в противном случае.

Преобразование 1

Исходный XML
<source>

<car id="a234" checked="yes"/>
<car id="a111" checked="yes"/>
<car id="a005"/>

</source>

Результат
<P>
  <B style="color:blue">a234</B>
</P>

<P>
  <B style="color:blue">a111</B>
</P>

<P>
  <B style="color:red">a005</B>
</P>

Представление HTML

a234

a111

a005

Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="car[not(@checked)]">
     <P>
          <B style="color:red">
               <xsl:value-of select="@id"/>
          </B>
     </P>
</xsl:template>

<xsl:template match="car[@checked]">
     <P>
          <B style="color:blue">
               <xsl:value-of select="@id"/>
          </B>
     </P>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функции true() и false() обычно используются для проверки некоторых условий в процессе программирования.

Преобразование 1

Исходный XML
<source>

<number>0</number>
<number>1</number>

</source>

Результат
<P>true not false</P>

<P>true not false</P>

Представление HTML

true not false

true not false
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="number">
     <P>
          <xsl:if test="true()">
               <xsl:text>true </xsl:text>
          </xsl:if>
          <xsl:if test="not(false())">
               <xsl:text>not false</xsl:text>
          </xsl:if>
     </P>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция lang() возвращает "истину" или "ложь" в зависимости от того, совпадает ли язык контекстного узла с идентификатором языка, переданным ей в качестве параметра. Она действует следующим образом. Язык контекстного узла определяется значением атрибута xml:lang или, если контекстный узел не имеет такого атрибута, значением атрибута xml:lang ближайшего предка. Если ни один из предков контекстного узла не имеет атрибута xml:lang, то функция lang() возвращает "ложь". Если же такой атрибут имеется, то функция lang() возвращает "истину", если значения атрибута и аргумента совпадают независимо от регистра символов, или значение атрибута имеет суффикс, начинающийся с символа "-", и его часть до суффикса совпадает со значением аргумента независимо от регистра символов, и "ложь" в противном случае.

Преобразование 1

Исходный XML
<source>

<P xml:lang="de">
     <text xml:lang="cs">a</text>
     <text xml:lang="en">and</text>
     <text>und</text>
</P>

</source>

Результат
<P>Czech: a</P>

<P>English: and</P>

<P>German: und</P>

Представление HTML

Czech: a

English: and

German: und
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="text">
     <P>
          <xsl:choose>
               <xsl:when test='lang("cs")'>
                    <xsl:text>Czech: </xsl:text>
               </xsl:when>
               <xsl:when test='lang("en")'>
                    <xsl:text>English: </xsl:text>
               </xsl:when>
               <xsl:when test='lang("de")'>
                    <xsl:text>German: </xsl:text>
               </xsl:when>
          </xsl:choose>
          <xsl:value-of select="."/>
     </P>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция string() преобразует свой аргумент к строковому типу. Эта функция обычно не используется явно в преобразованиях, так как в большинстве случаев она вызывается по умолчанию. Преобразование 1 является примером конвертации чисел в строковой тип. Обратите внимание на результат деления на 0.

Преобразование 1

Исходный XML
<source>

<number>9</number>
<number>0</number>
<number>-9</number>
<number/>

</source>

Результат
<P>9</P>
<P>NaN</P>
<P>9/0 = Infinity</P>
<P>-9/0 = -Infinity</P>
<P>0/0 = NaN</P>

Представление HTML

9

NaN

9/0 = Infinity

-9/0 = -Infinity

0/0 = NaN
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:variable name="A" select="number(//number[1])"/>
<xsl:variable name="B" select="number(//number[2])"/>
<xsl:variable name="C" select="number(//number[3])"/>
<xsl:variable name="D" select="number(//number[4])"/>
<xsl:template match="/">
     <P>
          <xsl:value-of select="string(number($A))"/>
     </P>
     <P>
          <xsl:value-of select="string(number($D))"/>
     </P>
     <P>
          <xsl:value-of select="$A"/>
          <xsl:text>/</xsl:text>
          <xsl:value-of select="$B"/>
          <xsl:text> = </xsl:text>
          <xsl:value-of select="string($A div $B)"/>
     </P>
     <P>
          <xsl:value-of select="$C"/>
          <xsl:text>/</xsl:text>
          <xsl:value-of select="$B"/>
          <xsl:text> = </xsl:text>
          <xsl:value-of select="string($C div $B)"/>
     </P>
     <P>
          <xsl:value-of select="$B"/>
          <xsl:text>/</xsl:text>
          <xsl:value-of select="$B"/>
          <xsl:text> = </xsl:text>
          <xsl:value-of select="$B div $B"/>
     </P>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция concat() возвращает конкатенацию своих аргументов.

Преобразование 1

Исходный XML
<source>

<text>Start</text>
<text>Body</text>
<text>Finish</text>

</source>

Результат
<P>Start - Body - Finish</P>

Представление HTML

Start - Body - Finish
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:variable name="T" select="concat(//text[1],' - ',//text[2],' - ',//text[3])"/>
<xsl:template match="/">
     <P>
          <xsl:value-of select="$T"/>
     </P>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция starts-with() принимает на вход два строковых аргумента и возвращает "истину", если первая строка начинается второй, и "ложь" в противном случае. Функция contains() также принимает на вход два строковых аргумента и возвращает "истину", если первая строка содержит вторую, и "ложь" в противном случае.

Преобразование 1

Исходный XML
<source>

<text>Welcome to XSL world.</text>
<string>Welcome</string>
<string>XSL</string>
<string>XML</string>

</source>

Результат
<TABLE border="1">
  <TR>
     <TH colspan="3">Welcome to XSL world.</TH>
  </TR>
  <TR>
     <TH>string</TH>
     <TH>starts-with</TH>
     <TH>contains</TH>
  </TR>
  <TR>
     <TD>Welcome</TD>
     <TD>true</TD>
     <TD>true</TD>
  </TR>
  <TR>
     <TD>XSL</TD>
     <TD>false</TD>
     <TD>true</TD>
  </TR>
  <TR>
     <TD>XML</TD>
     <TD>false</TD>
     <TD>false</TD>
  </TR>
</TABLE>

Представление HTML
Welcome to XSL world.
string | starts-with | contains
Welcome | true | true
XSL | false | true
XML | false | false
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE border="1">
          <TR>
               <TH colspan="3">
                    <xsl:value-of select="//text"/>
               </TH>
          </TR>
          <TR>
               <TH>string</TH>
               <TH>starts-with</TH>
               <TH>contains</TH>
          </TR>
          <xsl:for-each select="//string">
               <TR>
                    <TD>
                         <xsl:value-of select="."/>
                    </TD>
                    <TD>
                         <xsl:value-of select="starts-with(//text,.)"/>
                    </TD>
                    <TD>
                         <xsl:value-of select="contains(//text,.)"/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функции substring-before() и substring-after() находят в первой строке вторую. Первая из них возвращает подстроку, которая ей предшествует, а вторая — подстроку, котороя за ней следует. Функция substring() возвращает подстроку переданного ей строкового аргумента, начинающуюся с позиции, определенной вторым аргументом, и длиной, определенной в третьем аргументе. Если третий аргумент опущен, то она возвращает подстрока продолжается до конца строки. Позицией первого символа является 1 (преобразование 1). Преобразование 2 демонстрирует ситуацию, когда некоторые аргументы выходят за допустимый диапазон или не являются целыми. Возращаемая строка содержит те символы, для которых позиция больше или равна, чем значение второго аргумента и, если третий аргумент определен, меньше, чем сумма значений второго и третьего аргументов.

Преобразование 1

Исходный XML
<source>

<text>Welcome to XSL world.</text>
<string>XSL</string>
<start>4</start>
<end>10</end>

</source>

Результат
<DIV>
  <B>Text: </B>Welcome to XSL world.</DIV>
<B>Text before XSL: </B>Welcome to <DIV>
  <B>Text after XSL: </B> world.</DIV>
<DIV>
  <B>Text from position 4: </B>come to XSL world.</DIV>
<DIV>
  <B>Text from position 4 of length  10: </B>come to XS</DIV>

Представление HTML
Text: Welcome to XSL world.
Text before XSL: Welcome to
Text after XSL: world.
Text from position 4: come to XSL world.
Text from position 4 of length 10: come to XS
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <DIV>
          <B>
               <xsl:text>Text: </xsl:text>
          </B>
          <xsl:value-of select="//text"/>
     </DIV>
     <B>
          <xsl:text>Text before </xsl:text>
          <xsl:value-of select="//string"/>
          <xsl:text>: </xsl:text>
     </B>
     <xsl:value-of select="substring-before(//text,//string)"/>
     <DIV>
          <B>
               <xsl:text>Text after </xsl:text>
               <xsl:value-of select="//string"/>
               <xsl:text>: </xsl:text>
          </B>
          <xsl:value-of select="substring-after(//text,//string)"/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>Text from position </xsl:text>
               <xsl:value-of select="//start"/>
               <xsl:text>: </xsl:text>
          </B>
          <xsl:value-of select="substring(//text,//start)"/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>Text from position </xsl:text>
               <xsl:value-of select="//start"/>
               <xsl:text> of length </xsl:text>
               <xsl:value-of select="//end"/>
               <xsl:text>: </xsl:text>
          </B>
          <xsl:value-of select="substring(//text,//start,//end)"/>
     </DIV>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<text>Welcome to XSL world.</text>
<string>XSL</string>
<start>4</start>
<end>10</end>

</source>

Результат
<DIV>
  <B>Text from position -4: </B>Welcome to XSL world.</DIV>
<DIV>
  <B>Text from position 4.45: </B>come to XSL world.</DIV>
<DIV>
  <B>Text from position -8 of length  15: </B>Welcom</DIV>
<DIV>
  <B>Text from position 4.4 of length  1.7: </B>co</DIV>
<DIV>
  <B>Text from position 4.4 of length  1.2: </B>c</DIV>

Представление HTML
Text from position -4: Welcome to XSL world.
Text from position 4.45: come to XSL world.
Text from position -8 of length 15: Welcom
Text from position 4.4 of length 1.7: co
Text from position 4.4 of length 1.2: c
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <DIV>
          <B>
               <xsl:text>Text from position </xsl:text>
               <xsl:value-of select="//start * -1"/>
               <xsl:text>: </xsl:text>
          </B>
          <xsl:value-of select="substring(//text,//start * -1)"/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>Text from position </xsl:text>
               <xsl:value-of select="//start + 0.45"/>
               <xsl:text>: </xsl:text>
          </B>
          <xsl:value-of select="substring(//text,//start + 0.45)"/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>Text from position </xsl:text>
               <xsl:value-of select="//start *-2"/>
               <xsl:text> of length </xsl:text>
               <xsl:value-of select="//end *1.5"/>
               <xsl:text>: </xsl:text>
          </B>
          <xsl:value-of select="substring(//text,//start * -2,//end * 1.5)"/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>Text from position </xsl:text>
               <xsl:value-of select="//start + 0.4"/>
               <xsl:text> of length </xsl:text>
               <xsl:value-of select="//end div 10 + 0.7"/>
               <xsl:text>: </xsl:text>
          </B>
          <xsl:value-of select="substring(//text,//start + 0.4,//end div 10 + 0.7)"/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>Text from position </xsl:text>
               <xsl:value-of select="//start + 0.4"/>
               <xsl:text> of length </xsl:text>
               <xsl:value-of select="//end div 10 + 0.2"/>
               <xsl:text>: </xsl:text>
          </B>
          <xsl:value-of select="substring(//text,//start + 0.4,//end div 10 + 0.2)"/>
     </DIV>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция string-length() возвращает количество символов в строке. Функция normalize-space() производит так называемую нормализацию строкового аргумента относительно пробелов. Она удаляет пробелы в начале и в конце строки, а все последовательности пробелов в теле строки заменяются одиночным пробелом.

Преобразование 1

Исходный XML
<source>

<P>
     <text>Normalized text</text>
     <text>Sequences of whitespace characters</text>
     <text> Leading and trailing whitespace. </text>
</P>

</source>

Результат
<TABLE>
  <TR>
     <TH colspan="4">Normalized text</TH>
  </TR>
  <TR>
     <TD>Starting length:</TD>
     <TD>15</TD>
     <TD>Normalized length:</TD>
     <TD>15</TD>
  </TR>
  <TR>
     <TH colspan="4">Sequences   of      whitespace characters</TH>
  </TR>
  <TR>
     <TD>Starting length:</TD>
     <TD>41</TD>
     <TD>Normalized length:</TD>
     <TD>34</TD>
  </TR>
  <TR>
     <TH colspan="4">    Leading and trailing whitespace.    </TH>
  </TR>
  <TR>
     <TD>Starting length:</TD>
     <TD>40</TD>
     <TD>Normalized length:</TD>
     <TD>32</TD>
  </TR>
</TABLE>

Представление HTML
Normalized text
Starting length: | 15 | Normalized length: | 15
Sequences of whitespace characters
Starting length: | 41 | Normalized length: | 34
Leading and trailing whitespace.
Starting length: | 40 | Normalized length: | 32
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE>
          <xsl:for-each select="//text">
               <TR>
                    <TH colspan="4">
                         <xsl:value-of select="."/>
                    </TH>
               </TR>
               <TR>
                    <TD>Starting length:</TD>
                    <TD>
                         <xsl:value-of select="string-length(.)"/>
                    </TD>
                    <TD>Normalized length:</TD>
                    <TD>
                         <xsl:value-of select="string-length(normalize-space(.))"/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция translate() возвращает строку из первого аргумента, в которой символы из второго строкового аргумента в соответствии с их позицией заменены на символы из третьего строкового аргумента. Если какой-либо символ встречается во втором аргументе более, чем один раз, то учитывается только первое его появление. Если строка из третьего аргумента длиннее, чем строка из второго аргумента, то остаток строки игнорируется.

Преобразование 1

Исходный XML
<source>

<text>goose</text>

</source>

Результат
<P>goose</P>
<P>GOOSE</P>
<P>good</P>
<P>bad</P>
<P>books</P>

Представление HTML

goose

GOOSE

good

bad

books
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <P>
          <xsl:value-of select="//text"/>
     </P>
     <P>
          <xsl:value-of select="translate(//text,'egos','EGOS')"/>
     </P>
     <P>
          <xsl:value-of select="translate(//text,'se','d')"/>
     </P>
     <P>
          <xsl:value-of select="translate(//text,'gseo','bad')"/>
     </P>
     <P>
          <xsl:value-of select="translate(//text,'gseg','bksC')"/>
     </P>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция position() возвращает позицию контекста — число, равное порядковому номеру контекстного узла в обрабатываемом в данный момент множестве. Функция last() возвращает размер контекста — число, равное количеству узлов в обрабатываемом множестве. Преобразование 1 является демонстрацией использования этих функций в некоторых контекстах. В преобразовании 2 демонстрируется действие этих функций на отсортированные и неотсортированные множества узлов внутри элемента xsl:for-each.

Преобразование 1

Исходный XML
<source>

<AAA>
     <BBB>
          <CCC>Carl</CCC>
     </BBB>
     <BBB/>
     <BBB/>
</AAA>
<AAA>
     <BBB/>
     <BBB>
          <CCC>John</CCC>
          <CCC>Charles</CCC>
          <CCC>Robert</CCC>
          <CCC>Anthony</CCC>
     </BBB>
</AAA>

</source>

Результат
<DIV>BBB(1/5)(2/5)(3/5)(4/5)(5/5)</DIV>
<DIV>CCC(1/5)(2/5)(3/5)(4/5)(5/5)</DIV>
<DIV>CCC(1/4)(2/4)(3/4)(4/4)</DIV>

Представление HTML
BBB(1/5)(2/5)(3/5)(4/5)(5/5)
CCC(1/5)(2/5)(3/5)(4/5)(5/5)
CCC(1/4)(2/4)(3/4)(4/4)
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <DIV>
          <xsl:for-each select="//BBB">
               <xsl:call-template name="printout"/>
          </xsl:for-each>
     </DIV>
     <DIV>
          <xsl:apply-templates select="//CCC"/>
     </DIV>
     <DIV>
          <xsl:apply-templates select="//AAA[last()]//CCC"/>
     </DIV>
</xsl:template>

<xsl:template match="CCC">
     <xsl:call-template name="printout"/>
</xsl:template>

<xsl:template name="printout">
     <xsl:if test="position()=1">
          <xsl:value-of select="name()"/>
     </xsl:if>
     <xsl:text>(</xsl:text>
     <xsl:value-of select="position()"/>
     <xsl:text>/</xsl:text>
     <xsl:value-of select="last()"/>
     <xsl:text>)</xsl:text>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<AAA>
     <BBB>
          <CCC>Carl</CCC>
     </BBB>
     <BBB/>
     <BBB/>
</AAA>
<AAA>
     <BBB/>
     <BBB>
          <CCC>John</CCC>
          <CCC>Charles</CCC>
          <CCC>Robert</CCC>
          <CCC>Anthony</CCC>
     </BBB>
</AAA>

</source>

Результат
<TABLE border="1">
  <TR>
     <TH>Position</TH>
     <TH>Last</TH>
     <TH>Name</TH>
  </TR>
  <TR>
     <TD>1</TD>
     <TD>4</TD>
     <TD>John</TD>
  </TR>
  <TR>
     <TD>2</TD>
     <TD>4</TD>
     <TD>Charles</TD>
  </TR>
  <TR>
     <TD>3</TD>
     <TD>4</TD>
     <TD>Robert</TD>
  </TR>
  <TR>
     <TD>4</TD>
     <TD>4</TD>
     <TD>Anthony</TD>
  </TR>
</TABLE>
<TABLE border="1">
  <TR>
     <TH>Position</TH>
     <TH>Last</TH>
     <TH>Name</TH>
  </TR>
  <TR>
     <TD>1</TD>
     <TD>4</TD>
     <TD>Anthony</TD>
  </TR>
  <TR>
     <TD>2</TD>
     <TD>4</TD>
     <TD>Charles</TD>
  </TR>
  <TR>
     <TD>3</TD>
     <TD>4</TD>
     <TD>John</TD>
  </TR>
  <TR>
     <TD>4</TD>
     <TD>4</TD>
     <TD>Robert</TD>
  </TR>
</TABLE>

Представление HTML
Position | Last | Name
1 | 4 | John
2 | 4 | Charles
3 | 4 | Robert
4 | 4 | Anthony
Position | Last | Name
1 | 4 | Anthony
2 | 4 | Charles
3 | 4 | John
4 | 4 | Robert
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE border="1">
          <TR>
               <TH>Position</TH>
               <TH>Last</TH>
               <TH>Name</TH>
          </TR>
          <xsl:for-each select="//AAA[last()]//CCC">
               <TR>
                    <TD>
                         <xsl:value-of select="position()"/>
                    </TD>
                    <TD>
                         <xsl:value-of select="last()"/>
                    </TD>
                    <TD>
                         <xsl:value-of select="text()"/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
     <TABLE border="1">
          <TR>
               <TH>Position</TH>
               <TH>Last</TH>
               <TH>Name</TH>
          </TR>
          <xsl:for-each select="//AAA[last()]//CCC">
               <xsl:sort order="ascending" select="text()"/>
               <TR>
                    <TD>
                         <xsl:value-of select="position()"/>
                    </TD>
                    <TD>
                         <xsl:value-of select="last()"/>
                    </TD>
                    <TD>
                         <xsl:value-of select="text()"/>
                    </TD>
               </TR>
          </xsl:for-each>
     </TABLE>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция count() возвращает количество узлов в множестве, переданном ей в качестве аргумента.

Преобразование 1

Исходный XML
<source>

<AAA>
     <CCC/>
     <BBB>
          <CCC>Carl</CCC>
     </BBB>
     <BBB/>
     <BBB/>
</AAA>
<AAA>
     <CCC/>
     <BBB/>
     <BBB>
          <CCC>John</CCC>
          <CCC>Charles</CCC>
          <CCC>Robert</CCC>
          <CCC>Anthony</CCC>
     </BBB>
</AAA>

</source>

Результат
<DIV>
  <B>//AAA : </B>2</DIV>
<DIV>
  <B>//CCC : </B>7</DIV>
<DIV>
  <B>//AAA/CCC : </B>2</DIV>
<DIV>
  <B>//CCC[text()]) : </B>5</DIV>

Представление HTML
//AAA : 2
//CCC : 7
//AAA/CCC : 2
//CCC[text()]) : 5
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <DIV>
          <B>
               <xsl:text>//AAA : </xsl:text>
          </B>
          <xsl:value-of select="count(//AAA)"/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>//CCC : </xsl:text>
          </B>
          <xsl:value-of select="count(//CCC)"/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>//AAA/CCC : </xsl:text>
          </B>
          <xsl:value-of select="count(//AAA/CCC)"/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>//CCC[text()]) : </xsl:text>
          </B>
          <xsl:value-of select="count(//CCC[text()])"/>
     </DIV>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция id() позволяет обращаться к элементам по значениям их уникальных идентификаторов. Преобразование 1 является простым примером ее использования. Тщательно изучите преобразование 2. Содержание элемента title не отображается внутри квадратных скобок, так как в DTD его атрибут id определен как CDATA, а не как ID. Одновременно можно обрабатывать несколько идентификаторов (преобразование 3).

Преобразование 1

Исходный XML
<!DOCTYPE source [

<!ELEMENT chapter ANY>

<!ATTLIST chapter id ID #REQUIRED>

<!ELEMENT title ANY>

<!ATTLIST title id CDATA #REQUIRED>

<!ELEMENT text ANY>

<!ATTLIST text value ID #REQUIRED>

]>
<source>

<chapter id="intro">Introduction</chapter>
<chapter id="body">
     <title id="t1">BODY</title>
     <text value="text1">text text text</text>
</chapter>
<chapter id="end">THE END</chapter>

</source>

Результат
<P>Introduction</P>
<P>text text text</P>
<P>text text text</P>

Представление HTML

Introduction

text text text

text text text
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <P>
          <xsl:value-of select="id('intro')"/>
     </P>
     <P>
          <xsl:value-of select="id('body')/text"/>
     </P>
     <P>
          <xsl:value-of select="id('text1')"/>
     </P>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<!DOCTYPE source [

<!ELEMENT chapter ANY>

<!ATTLIST chapter id ID #REQUIRED>

<!ELEMENT title ANY>

<!ATTLIST title id CDATA #REQUIRED>

<!ELEMENT text ANY>

<!ATTLIST text value ID #REQUIRED>

]>
<source>

<chapter id="intro">Introduction</chapter>
<chapter id="body">
     <title id="t1">BODY</title>
     <text value="text1">text text text</text>
</chapter>
<chapter id="end">THE END</chapter>

</source>

Результат
<DIV>chapter : id = intro [ Introduction]</DIV>
<DIV>chapter : id = body [
BODY
text text text
]</DIV>
<DIV>title : id = t1 [ ]</DIV>
<DIV>text : value = text1 [ text text text]</DIV>
<DIV>chapter : id = end [ THE END]</DIV>

Представление HTML
chapter : id = intro [ Introduction]
chapter : id = body [ BODY text text text ]
title : id = t1 [ ]
text : value = text1 [ text text text]
chapter : id = end [ THE END]
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:for-each select="//*[@*]">
          <DIV>
               <xsl:value-of select="name()"/>
               <xsl:text> : </xsl:text>
               <xsl:apply-templates select="@*"/>
          </DIV>
     </xsl:for-each>
</xsl:template>

<xsl:template match="@*">
     <xsl:value-of select="name()"/>
     <xsl:text> = </xsl:text>
     <xsl:value-of select="."/>
     <xsl:text> [ </xsl:text>
     <xsl:value-of select="id(.)"/>
     <xsl:text>]</xsl:text>
</xsl:template>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<!DOCTYPE source [

<!ELEMENT chapter ANY>

<!ATTLIST chapter id ID #REQUIRED>

<!ELEMENT title ANY>

<!ATTLIST title id CDATA #REQUIRED>

<!ELEMENT text ANY>

<!ATTLIST text value ID #REQUIRED>

]>
<source>

<chapter id="intro">Introduction</chapter>
<chapter id="body">
     <title id="t1">BODY</title>
     <text value="text1">text text text</text>
</chapter>
<chapter id="end">THE END</chapter>

</source>

Результат
<P style="color:red">Introduction</P>
<P style="color:red">
BODY
text text text
</P>
<P style="color:red">THE END</P>
<P>Introduction</P>
<P>Introduction</P>
<P>THE END</P>

Представление HTML

Introduction

BODY text text text

THE END

Introduction

Introduction

THE END
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:apply-templates select="id('intro body end')"/>
     <P>
          <xsl:value-of select="id('intro body end')"/>
     </P>
     <P>
          <xsl:value-of select="id('body end intro')"/>
     </P>
     <P>
          <xsl:value-of select="id('in bod end')"/>
     </P>
</xsl:template>

<xsl:template match="*">
     <P style="color:red">
          <xsl:value-of select="."/>
     </P>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Пример использования функции id().

Преобразование 1

Исходный XML
<!DOCTYPE source [

<!ELEMENT xslTutorial (doc,note*)>

<!ELEMENT doc (#PCDATA|ref)*>

<!ELEMENT  ref EMPTY>

<!ATTLIST ref id IDREF #REQUIRED>

<!ELEMENT note (#PCDATA)>

<!ATTLIST note id ID #REQUIRED>

]>
<source>

<doc> This text
     <ref id="n3"/> demonstrates
     <ref id="n1"/> a possible usage of id function
     <ref id="n2"/>.
</doc>
<note id="n1">Note n1</note>
<note id="n2">Note n2</note>
<note id="n3">Note n3</note>

</source>

Результат
This text
<SUP>1</SUP>
demonstrates <SUP>2</SUP>
a possible usage
of id function <SUP>3</SUP>.

<HR>
<DIV>1. Note n3</DIV>
<DIV>2. Note n1</DIV>
<DIV>3. Note n2</DIV>

Представление HTML
This text 1 demonstrates 2 a possible usage of id function 3.
1. Note n3
2. Note n1
3. Note n2
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method="html"/>
<xsl:template match="/">
     <xsl:apply-templates select="//doc"/>
     <HR/>
     <xsl:for-each select="//ref">
          <xsl:apply-templates select="id(@id)">
               <xsl:with-param name="nmbr">
                    <xsl:value-of select="position()"/>
               </xsl:with-param>
          </xsl:apply-templates>
     </xsl:for-each>
</xsl:template>

<xsl:template match="ref">
     <SUP>
          <xsl:value-of select="count(//doc/*) - count(following::ref)"/>
     </SUP>
</xsl:template>

<xsl:template match="note">
     <xsl:param name="nmbr">1</xsl:param>
     <DIV>
          <xsl:number value="$nmbr" format="1. "/>
          <xsl:value-of select="."/>
     </DIV>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функции name(), local-name() и namespace-uri() используются для получения информации имени элемента или атрибута и пространстве имен.

Преобразование 1

Исходный XML
<source xmlns:zvon="http://zvon.org/" xmlns:ict="XXX" >

<zvon:id>ZvonAAA</zvon:id>
<zvon:size>258</zvon:size>
<ict:id>ICT1258</ict:id>

</source>

Результат
<TABLE border="1">
  <TR>
     <TH>name</TH>
     <TH>local</TH>
     <TH>URI</TH>
  </TR>
  <TR>
     <TD>source</TD>
     <TD>source</TD>
     <TD/>
  </TR>
  <TR>
     <TD>zvon:id</TD>
     <TD>id</TD>
     <TD>http://zvon.org/</TD>
  </TR>
  <TR>
     <TD>zvon:size</TD>
     <TD>size</TD>
     <TD>http://zvon.org/</TD>
  </TR>
  <TR>
     <TD>ict:id</TD>
     <TD>id</TD>
     <TD>XXX</TD>
  </TR>
</TABLE>

Представление HTML
name | local | URI
source | source |
zvon:id | id | http://zvon.org/
zvon:size | size | http://zvon.org/
ict:id | id | XXX
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE border="1">
          <TR>
               <TH>name</TH>
               <TH>local</TH>
               <TH>URI</TH>
          </TR>
          <xsl:apply-templates select="//*"/>
     </TABLE>
</xsl:template>

<xsl:template match="*">
     <TR>
          <TD>
               <xsl:value-of select="name()"/>
          </TD>
          <TD>
               <xsl:value-of select="local-name()"/>
          </TD>
          <TD>
               <xsl:value-of select="namespace-uri()"/>
          </TD>
     </TR>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Элемент xsl:output позволяет авторам преобразований определять, в каком виде должно быть представлено результирующее дерево. Если XSLT-процессор выводит результирующее дерево, то он должен делать это в точности так, как определено элементом xsl:output. Элемент xsl:output является элементом только верхнего уровня. В преобразовании 1 используется метод вывода "html", а в преобразовании 2 — "xml". Сравните вывод пустых элементов.

Преобразование 1

Исходный XML
<source>

<hr> </hr>
<hr/>
<hr/>

</source>

Результат
<source>

  <hr>

  <hr>

  <hr>

</source>

Представление HTML
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method="html"/>
<xsl:template match="/">
     <xsl:copy-of select="/source"/>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<hr> </hr>
<hr/>
<hr/>

</source>

Результат
<source>
<hr> </hr>
<hr/>
<hr/>
</source>

Представление HTML
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method="xml"/>
<xsl:template match="/">
     <xsl:copy-of select="/source"/>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Если элемент xml:output отсутствует, то по умолчанию методом вывода бедет "xml" (преобразование 1), однако, если корневой элемент выходного документа имеет значение "html" (независимо от регистра символов), то методом вывода будет "html" (преобразование 2).

Преобразование 1

Исходный XML
<source>

<h1> XML output </h1>
<hr/>

</source>

Результат
<h1> XML output </h1>
<hr/>

Представление HTML

XML output

Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <xsl:copy-of select="/source/*"/>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<h1> XML output </h1>
<hr/>

</source>

Результат
<html>
  <h1> XML output </h1>
  <hr>
</html>

Представление HTML

XML output

Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <html>
          <xsl:copy-of select="/source/*"/>
     </html>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Метод вывода "html" для пустых элементов, определенных спецификацией HTML, выводит тэги без косой черты после имени и закрывающих тэгов. Также при использовании этого метода вывода процессор не должен анализировать содержимое элементов script и style. Сравните с преобразованием 2. Для получения более подробной информации обратитесь к Спецификации XSLT.

Преобразование 1

Исходный XML
<source>

<h1> HTML output </h1>
<AAA/>
<HR/>
<script> if (a < b) foo(); if (cc < dd) foo() </script>
<hr/>
<hr> </hr>
<Hr/>
<hR/>

</source>

Результат
<h1> HTML output </h1>
<AAA></AAA>
<HR><script>
if (a < b) foo();
if (cc < dd) foo()
</script><hr>
<hr>
<Hr>
<hR>

Представление HTML

HTML output

Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method="html"/>
<xsl:template match="/">
     <xsl:copy-of select="/source/*"/>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<h1> HTML output </h1>
<AAA/>
<HR/>
<script> if (a < b) foo(); if (cc < dd) foo() </script>
<hr/>
<hr> </hr>
<Hr/>
<hR/>

</source>

Результат
<h1> HTML output </h1><AAA/><HR/><script>
if (a &lt; b) foo();
if (cc &lt; dd) foo()
</script><hr/><hr>        </hr><Hr/><hR/>

Представление HTML

HTML output

Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method="xml"/>
<xsl:template match="/">
     <xsl:copy-of select="/source/*"/>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Атрибут encoding определяет, какая кодировка предпочтительна для выходящего документа. Метод вывода "html" должен добавить непосредственно за открывающим тэгом элемента HEAD элемент META с определением используемой кодировки. Преобразование 1 использует для вывода кодировку UTF-8, преобразование 2 — UTF-16, а преобразование 3 — Cp1250.

Преобразование 1

Исходный XML
<source>

<html>
     <head>
          <title>HTML</title>
     </head>
     <body>
          <h1> HTML output </h1> Žížala šnek kočka pařez bečka měšec výr
     </body>
</html>

</source>

Результат
<html>

  <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

     <title>HTML</title>

  </head>

  <body>

     <h1> HTML output </h1>
     &#381;&iacute;&#382;ala &#353;nek
     ko&#269;ka pa&#345;ez
     be&#269;ka m&#283;&#353;ec v&yacute;r

  </body>

</html>

Представление HTML
HTML

HTML output

Žížala šnek kočka pařez bečka měšec výr
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
     <xsl:copy-of select="/source/*"/>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<html>
     <head>
          <title>HTML</title>
     </head>
     <body>
          <h1> HTML output </h1> Žížala šnek kočka pařez bečka měšec výr
     </body>
</html>

</source>

Результат
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-16">

<title>HTML</title>

</head>

<body>

<h1> HTML output </h1>
&#381;&iacute;&#382;ala &#353;nek
ko&#269;ka pa&#345;ez
be&#269;ka m&#283;&#353;ec v&yacute;r

</body>

</html>

Представление HTML
HTML

HTML output

Žížala šnek kočka pařez bečka měšec výr
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method="html" encoding="UTF-16"/>
<xsl:template match="/">
     <xsl:copy-of select="/source/*"/>
</xsl:template>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<source>

<html>
     <head>
          <title>HTML</title>
     </head>
     <body>
          <h1> HTML output </h1> Žížala šnek kočka pařez bečka měšec výr
     </body>
</html>

</source>

Результат
<html>

  <head>
     <meta http-equiv="Content-Type" content="text/html; charset=Cp1250">

     <title>HTML</title>

  </head>

  <body>

     <h1> HTML output </h1>
     &#381;&iacute;&#382;ala &#353;nek
     ko&#269;ka pa&#345;ez
     be&#269;ka m&#283;&#353;ec v&yacute;r

  </body>

</html>

Представление HTML
HTML

HTML output

Žížala šnek kočka pařez bečka měšec výr
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method="html" encoding="Cp1250"/>
<xsl:template match="/">
     <xsl:copy-of select="/source/*"/>
</xsl:template>

</xsl:stylesheet>

Преобразование 4

Исходный XML
<source>

<html>
     <head>
          <title>HTML</title>
     </head>
     <body>
          <h1> HTML output </h1> Žížala šnek kočka pařez bečka měšec výr
     </body>
</html>

</source>

Результат
<html>

  <head>
     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

     <title>HTML</title>

  </head>

  <body>

     <h1> HTML output </h1>
     &#381;&iacute;&#382;ala &#353;nek
     ko&#269;ka pa&#345;ez
     be&#269;ka m&#283;&#353;ec v&yacute;r

  </body>

</html>

Представление HTML
HTML

HTML output

Žížala šnek kočka pařez bečka měšec výr
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method="html" encoding="ISO-8859-1"/>
<xsl:template match="/">
     <xsl:copy-of select="/source/*"/>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Метод вывода "text" выводит результирующее дерево посредством вывода строковых значений каждого текстового узла в порядке следования в документе без каких-либо изменений.

Преобразование 1

Исходный XML
<source>

<AAA id="12"/>

</source>

Результат
<!ELEMENT AAA ANY><!ATTLIST AAA id ID #REQUIRED>Look at my source in your browser

Представление HTML
Look at my source in your browser
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method="text"/>
<xsl:template match="AAA">
     <xsl:text><!ELEMENT </xsl:text>
     <xsl:value-of select="name()"/>
     <xsl:text> ANY></xsl:text>
     <xsl:text><!ATTLIST </xsl:text>
     <xsl:value-of select="name()"/>
     <xsl:text> </xsl:text>
     <xsl:value-of select="name(@*)"/>
     <xsl:text> ID #REQUIRED></xsl:text>
     <xsl:text>Look at my source in your browser</xsl:text>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция current() возвращает множество, состоящее только из текущего узла преобразования. Для наиболее удаленых выражений (выражений, не встречающихся внутри других выражений), текущий узел всегда совпадает с узлом контекста. Однако, внутри квадратных скобок обычно они являются двумя различными узлами.

Преобразование 1

Исходный XML
<source>

<AAA name="first">
     <BBB name="first">11111</BBB>
     <BBB name="second">22222</BBB>
</AAA>
<AAA name="second">
     <BBB name="first">33333</BBB>
     <BBB name="second">44444</BBB>
</AAA>

</source>

Результат
<TABLE border="1">
  <TR>
     <TH> . </TH>
     <TH>current()</TH>
  </TR>
  <TR>
     <TD>first</TD>
     <TD>first</TD>
  </TR>
  <TR>
     <TD>11111</TD>
     <TD>1111122222</TD>
  </TR>
  <TR>
     <TD>second</TD>
     <TD>second</TD>
  </TR>
  <TR>
     <TD>33333</TD>
     <TD/>
  </TR>
</TABLE>

Представление HTML
. | current()
first | first
11111 | 1111122222
second | second
33333 |
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <TABLE border="1">
          <TR>
               <TH> . </TH>
               <TH>current()</TH>
          </TR>
          <xsl:apply-templates select="//AAA"/>
     </TABLE>
</xsl:template>

<xsl:template match="AAA">
     <TR>
          <TD>
               <xsl:value-of select="./@name"/>
          </TD>
          <TD>
               <xsl:value-of select="current()/@name"/>
          </TD>
     </TR>
     <TR>
          <TD>
               <xsl:apply-templates select="BBB[./@name='first']"/>
          </TD>
          <TD>
               <xsl:apply-templates select="BBB[current()/@name='first']"/>
          </TD>
     </TR>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Функция generate-id() используется для создания уникального идентификатора, отвечающего Спецификации XML. Преобразование 1 использует эту функцию для добавления идентификатора ко всем элементам исходного XML.

Преобразование 1

Исходный XML
<source>

<AAA name="top">
     <BBB pos="1" val="bbb">11111</BBB>
     <BBB>22222</BBB>
</AAA>
<AAA name="bottom">
     <BBB>33333</BBB>
     <BBB>44444</BBB>
</AAA>

</source>

Результат
<DIV>
  <B>generate-id(//AAA) : </B>d0e3</DIV>
<DIV>
  <B>generate-id(//BBB) : </B>d0e5</DIV>
<DIV>
  <B>generate-id(//AAA[1]) : </B>d0e3</DIV>
<DIV>
  <B>generate-id(//*[1]) : </B>d0e1</DIV>
<DIV>
  <B>generate-id(//xslTutorial/*[1]) : </B>
</DIV>

Представление HTML
generate-id(//AAA) : d0e3
generate-id(//BBB) : d0e5
generate-id(//AAA[1]) : d0e3
generate-id(//*[1]) : d0e1
generate-id(//xslTutorial/*[1]) :
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
     <DIV>
          <B>
               <xsl:text>generate-id(//AAA) : </xsl:text>
          </B>
          <xsl:value-of select="generate-id(//AAA) "/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>generate-id(//BBB) : </xsl:text>
          </B>
          <xsl:value-of select="generate-id(//BBB) "/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>generate-id(//AAA[1]) : </xsl:text>
          </B>
          <xsl:value-of select="generate-id(//AAA[1]) "/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>generate-id(//*[1]) : </xsl:text>
          </B>
          <xsl:value-of select="generate-id(//*[1]) "/>
     </DIV>
     <DIV>
          <B>
               <xsl:text>generate-id(//xslTutorial/*[1]) : </xsl:text>
          </B>
          <xsl:value-of select="generate-id(//xslTutorial/*[1]) "/>
     </DIV>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<AAA name="top">
     <BBB pos="1" val="bbb">11111</BBB>
     <BBB>22222</BBB>
</AAA>
<AAA name="bottom">
     <BBB>33333</BBB>
     <BBB>44444</BBB>
</AAA>

</source>

Результат
<source id="d0e1">

  <AAA id="d0e3" name="top">

     <BBB id="d0e5" pos="1" val="bbb">11111</BBB>

     <BBB id="d0e8">22222</BBB>

  </AAA>

  <AAA id="d0e12" name="bottom">

     <BBB id="d0e14">33333</BBB>

     <BBB id="d0e17">44444</BBB>

  </AAA>

</source>

Представление HTML
11111 22222 33333 44444
Преобразование XSLT
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="*">
     <xsl:copy>
          <xsl:attribute name="id">
               <xsl:value-of select="generate-id()"/>
          </xsl:attribute>
          <xsl:for-each select="@*">
               <xsl:attribute name="{name()}">
                    <xsl:value-of select="."/>
               </xsl:attribute>
          </xsl:for-each>
          <xsl:apply-templates/>
     </xsl:copy>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

В преобразование можно импортировать (xsl:import) и включать (xsl:include) внешните файлы преобразований. Импортирование почти полностью аналогично включению за исключением того, что определения и шаблоны в основном файле имеют превосходство над шаблонами и определениями в импортируемых файлах. Преобразования 1 и 2 импортируются или включаются в остальные.

Преобразование 1

Исходный XML
<source>

<H1>IMPORTING STYLESHEETS</H1>

</source>

Результат
IMPORTING STYLESHEETS

Представление HTML
IMPORTING STYLESHEETS
XSLT stylesheet (file: id2.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:variable name="id2">Stylesheet 1(id2.xsl)</xsl:variable>
<xsl:variable name="t">Variable t from id2.xsl</xsl:variable>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<H1>IMPORTING STYLESHEETS</H1>

</source>

Результат
IMPORTING STYLESHEETS

Представление HTML
IMPORTING STYLESHEETS
XSLT stylesheet (file: id3.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:variable name="id3">Stylesheet 2(id3.xsl)</xsl:variable>
<xsl:variable name="t">Variable t from id3.xsl</xsl:variable>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<source>

<H1>IMPORTING STYLESHEETS</H1>

</source>

Результат
<P>Stylesheet 1(id2.xsl)</P>
<P>Stylesheet 2(id3.xsl)</P>

Представление HTML

Stylesheet 1(id2.xsl)

Stylesheet 2(id3.xsl)
XSLT stylesheet (file: id4.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:import href="id3.xsl"/>
<xsl:include href="id2.xsl"/>
<xsl:template match="/">
<P>
<xsl:value-of select="$id2"/>
</P>
<P>
<xsl:value-of select="$id3"/>
</P>
</xsl:template>

</xsl:stylesheet>

Преобразование 4

Исходный XML
<source>

<H1>IMPORTING STYLESHEETS</H1>

</source>

Результат
<P>Stylesheet 1(id2.xsl)</P>
<P>Stylesheet 2(id3.xsl)</P>
<P>Variable t from id3.xsl</P>

Представление HTML

Stylesheet 1(id2.xsl)

Stylesheet 2(id3.xsl)

Variable t from id3.xsl
XSLT stylesheet (file: id7.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:import href="id2.xsl"/>
<xsl:import href="id3.xsl"/>
<xsl:template match="/">
<P>
<xsl:value-of select="$id2"/>
</P>
<P>
<xsl:value-of select="$id3"/>
</P>
<P>
<xsl:value-of select="$t"/>
</P>
</xsl:template>

</xsl:stylesheet>

Преобразование 5

Исходный XML
<source>

<H1>IMPORTING STYLESHEETS</H1>

</source>

Результат
<P>Stylesheet 1(id2.xsl)</P>
<P>Stylesheet 2(id3.xsl)</P>
<P>Variable t from id2.xsl</P>

Представление HTML

Stylesheet 1(id2.xsl)

Stylesheet 2(id3.xsl)

Variable t from id2.xsl
XSLT stylesheet (file: id8.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:import href="id3.xsl"/>
<xsl:import href="id2.xsl"/>
<xsl:template match="/">
<P>
<xsl:value-of select="$id2"/>
</P>
<P>
<xsl:value-of select="$id3"/>
</P>
<P>
<xsl:value-of select="$t"/>
</P>
</xsl:template>

</xsl:stylesheet>

Преобразование 6

Исходный XML
<source>

<H1>IMPORTING STYLESHEETS</H1>

</source>

Результат
<P>Stylesheet 1(id2.xsl)</P>
<P>Stylesheet 2(id3.xsl)</P>
<P>Variable t from id2.xsl</P>

Представление HTML

Stylesheet 1(id2.xsl)

Stylesheet 2(id3.xsl)

Variable t from id2.xsl
XSLT stylesheet (file: id9.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:import href="id3.xsl"/>
<xsl:include href="id2.xsl"/>
<xsl:template match="/">
<P>
<xsl:value-of select="$id2"/>
</P>
<P>
<xsl:value-of select="$id3"/>
</P>
<P>
<xsl:value-of select="$t"/>
</P>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

В преобразование 3 включается преобразование 2, в которое, в свою очередь, импортируется преобразование 1.

Преобразование 1

Исходный XML
<source>

<AAA>red</AAA>
<BBB>blue</BBB>
<CCC>purple</CCC>

</source>

Результат
<h3 style="color:red">red</h3>
blue
purple

Представление HTML

red

blue purple
XSLT stylesheet (file: id2.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="AAA">
<h3 style="color:{.}">
<xsl:value-of select="."/>
</h3>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<AAA>red</AAA>
<BBB>blue</BBB>
<CCC>purple</CCC>

</source>

Результат
<h3 style="color:red">red</h3>

<h2 style="color:blue">blue</h2>
purple

Представление HTML

red

blue

purple
XSLT stylesheet (file: id3.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:import href="id2.xsl"/>
<xsl:template match="BBB">
<h2 style="color:{.}">
<xsl:value-of select="."/>
</h2>
</xsl:template>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<source>

<AAA>red</AAA>
<BBB>blue</BBB>
<CCC>purple</CCC>

</source>

Результат
<h3 style="color:red">red</h3>

<h2 style="color:blue">blue</h2>

<h1 style="color:purple">purple</h1>

Представление HTML

red

blue

purple
XSLT stylesheet (file: id4.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:include href="id3.xsl"/>
<xsl:template match="CCC">
<h1 style="color:{.}">
<xsl:value-of select="."/>
</h1>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Другие примеры использования xsl:include и xsl:import.

Преобразование 1

Исходный XML
<source>

<AAA/>
<BBB/>
<CCC/>

</source>

Результат
<DIV style="color:red">AAA (according to Stylesheet 1 (id2.xsl)</DIV>

<DIV style="color:red">BBB (according to Stylesheet 1 (id2.xsl)</DIV>

<DIV style="color:red">CCC (according to Stylesheet 1 (id2.xsl)</DIV>

Представление HTML
AAA (according to Stylesheet 1 (id2.xsl)
BBB (according to Stylesheet 1 (id2.xsl)
CCC (according to Stylesheet 1 (id2.xsl)
XSLT stylesheet (file: id2.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/*/*">
<DIV style="color:red">
<xsl:value-of select="name()"/>
<xsl:text> (according to Stylesheet 1 (id2.xsl)</xsl:text>
</DIV>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<AAA/>
<BBB/>
<CCC/>

</source>

Результат
<DIV style="color:blue">AAA(according to this stylesheet)</DIV>

<DIV style="color:blue">BBB(according to this stylesheet)</DIV>

<DIV style="color:blue">CCC(according to this stylesheet)</DIV>

Представление HTML
AAA(according to this stylesheet)
BBB(according to this stylesheet)
CCC(according to this stylesheet)
XSLT stylesheet (file: id3.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:include href="id2.xsl"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="/*/*">
<DIV style="color:blue">
<xsl:value-of select="name()"/>
<xsl:text>(according to this stylesheet)</xsl:text>
</DIV>
</xsl:template>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<source>

<AAA/>
<BBB/>
<CCC/>

</source>

Результат
<DIV style="color:blue">AAA(according to this stylesheet)</DIV>

<DIV style="color:blue">BBB(according to this stylesheet)</DIV>

<DIV style="color:blue">CCC(according to this stylesheet)</DIV>

Представление HTML
AAA(according to this stylesheet)
BBB(according to this stylesheet)
CCC(according to this stylesheet)
XSLT stylesheet (file: id4.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:import href="id2.xsl"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="/*/*">
<DIV style="color:blue">
<xsl:value-of select="name()"/>
<xsl:text>(according to this stylesheet)</xsl:text>
</DIV>
</xsl:template>

</xsl:stylesheet>

Преобразование 4

Исходный XML
<source>

<AAA/>
<BBB/>
<CCC/>

</source>

Результат
<DIV style="color:red">AAA (according to Stylesheet 1 (id2.xsl)</DIV>

<DIV style="color:red">BBB (according to Stylesheet 1 (id2.xsl)</DIV>

<DIV style="color:red">CCC (according to Stylesheet 1 (id2.xsl)</DIV>

Представление HTML
AAA (according to Stylesheet 1 (id2.xsl)
BBB (according to Stylesheet 1 (id2.xsl)
CCC (according to Stylesheet 1 (id2.xsl)
XSLT stylesheet (file: id5.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="/*/*">
<DIV style="color:blue">
<xsl:value-of select="name()"/>
<xsl:text>(according to this stylesheet)</xsl:text>
</DIV>
</xsl:template>

<xsl:include href="id2.xsl"/>

</xsl:stylesheet>


XSLT в примерах

Вы можете использовать элемент xsl:apply-imports для получения информации из импортированных шаблонов, чье поведение, однако, вы изменяете. В преобразование 2 импортируется преобразование 1, а его шаблоны аннулируются. Преобразование 3 импортирует преобразование 1 и изменяет его шаблоны. Инструкция xsl:apply-imports работает только для шаблонов импортированных с помощью xsl:import, а не включенных с помощью xsl:include (преобразование 4).

Преобразование 1

Исходный XML
<source>

<AAA/>
<BBB/>
<CCC/>

</source>

Результат
<DIV style="color:red">AAA</DIV>

<DIV style="color:red">BBB</DIV>

<DIV style="color:red">CCC</DIV>

Представление HTML
AAA
BBB
CCC
XSLT stylesheet (file: id2.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/*/*">
<DIV style="color:red">
<xsl:value-of select="name()"/>
</DIV>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<AAA/>
<BBB/>
<CCC/>

</source>

Результат
<EM>AAA</EM>

<EM>BBB</EM>

<EM>CCC</EM>

Представление HTML
AAA BBB CCC
XSLT stylesheet (file: id3.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:import href="id2.xsl"/>
<xsl:template match="/*/*">
<EM>
<xsl:value-of select="name()"/>
</EM>
</xsl:template>

</xsl:stylesheet>

Преобразование 3

Исходный XML
<source>

<AAA/>
<BBB/>
<CCC/>

</source>

Результат
<EM>
  <DIV style="color:red">AAA</DIV>
</EM>

<EM>
  <DIV style="color:red">BBB</DIV>
</EM>

<EM>
  <DIV style="color:red">CCC</DIV>
</EM>

Представление HTML
AAA
BBB
CCC
XSLT stylesheet (file: id4.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:import href="id2.xsl"/>
<xsl:template match="/*/*">
<EM>
<xsl:apply-imports/>
</EM>
</xsl:template>

</xsl:stylesheet>

Преобразование 4

Исходный XML
<source>

<AAA/>
<BBB/>
<CCC/>

</source>

Результат
<EM/>

<EM/>

<EM/>

Представление HTML
XSLT stylesheet (file: id5.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:include href="id2.xsl"/>
<xsl:template match="/*/*">
<EM>
<xsl:apply-imports/>
</EM>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Превосходство при импорте сильней, чем превосходство приоритета. Смотрите преобразование 2.

Преобразование 1

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<H3 style="color:blue">CCC (id=c1)</H3>
<H3 style="color:blue">CCC (id=c2)</H3>
<H3 style="color:blue">CCC (id=c3)</H3>

Представление HTML

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)
XSLT stylesheet (file: id2.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
<xsl:apply-templates select="//CCC"/>
</xsl:template>

<xsl:template match="CCC" priority="10">
<H3 style="color:blue">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H3>
</xsl:template>

</xsl:stylesheet>

Преобразование 2

Исходный XML
<source>

<AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
</AAA>
<AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
          <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
          <CCC id="c3"/>
     </BBB>
</AAA>

</source>

Результат
<H3 style="color:red">CCC (id=c1)</H3>
<H3 style="color:red">CCC (id=c2)</H3>
<H3 style="color:red">CCC (id=c3)</H3>

Представление HTML

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)
XSLT stylesheet (file: id3.xsl )
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:import href="id2.xsl"/>
<xsl:template match="/">
<xsl:apply-templates select="//CCC"/>
</xsl:template>

<xsl:template match="CCC" priority="-100">
<H3 style="color:red">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H3>
</xsl:template>

</xsl:stylesheet>


XSLT в примерах

Страница 1 | С XSL вы можете свободно модифицировать исходный текст. Так с помощью этого и этого преобразований можно получить различный результат из одного исходного файла.
Страница 2 | Каждое преобразование XSL должно начинаться с элемента xsl:stylesheet. Атрибут version='1.0' определяет версию спецификации XSL. Этот пример представляет собой простейшее возможное преобразование. Поскольку оно не содержит чего-либо помимо заголовка, то используется обработка по умолчанию.
Страница 3 | XSLT-процессоры анализируют исходный XML и пытаются найти подходящий XSL-шаблон. Если такой шаблон найден, то выполняются инструкции внутри него.
Страница 4 | Содержание элементов может быть извлечено из исходного документа двумя основными способами. Это преобразование использует инструкцию xsl:value-of. В этом случае содержание элемента используется без какой-либо дальнейшей обработки. Инструкция xsl:apply-templates в этом преобразовании действует по-другому. Здесь XSLT-процессор продолжает обрабатывать выбранные элементы, для которых определен шаблон.

Шаблоны

Страница 5 | XSLT-процессоры анализируют исходный XML и пытаются найти подходящий XSL-шаблон. Если такой шаблон найден, то выполняются инструкции внутри него.
Страница 6 | Части XML-документа, к которым должен применяться шаблон, определяются путями адресации. Их синтаксис описан в Спецификации XPath. В простейших случаях он очень похож на адресацию файловой системы (это преобразование).
Страница 7 | Обработка всегда начинается с шаблона, где match="/". Это значение пути адресации соответствует корневому узлу (в нашем случае source). Однако многие преобразования XSL не содержат такой шаблон явно. В этом случае используется неявный шаблон (он содержит только единственную инструкцию). Эта инструкция обозначает: обрабатывать все дочерние элементы текущего узла, включая текстовые узлы. Сравните это и это преобразования. Когда шаблон для узла существует, никакой обработки по умолчанию не происходит (это преобразование). Если вы хотите включить обработку потомков узла, то вы должны явно указать шаблоны для них (это преобразование).
Страница 8 | Соответствие шаблонов определяется путями адресации, где конкретные пути разделяются с помощью символа "|" (это преобразование). Символ "*" обозначает все возможности. Сравните это и это преобразования.
Страница 9 | "//" очень часто встречается в путях адресации. Когда он используется в начале пути адресации, он обозначает: выбрать все узлы определенного типа в документе (это преобразование). Внутри пути адресации он обозначает: выбрать все узлы, являющиеся потомками узла, указанного в первой части пути адресации (это преобразование).
Страница 10 | С помощью режимов (modes) элемент может быть обработан многократно, причем каждый раз с различным результатом. В этом преобразовании один из режимов не существует.
Страница 11 | Достаточно часто несколько шаблонов соответствует одному и тому же элементу в исходном XML. Поэтому надо решить, какой из них следует использовать. Для этого можно определить приоритеты с помощью атрибута priority. Если этот атрибут не определен, его приоритет вычисляется в соответствии с несколькими правилами. Это и это преобразования различаются приоритетами их шаблонов. Это преобразование показывает действие по умолчанию в отсутствие атрибутов priority. Шаблон CCC имеет меньший приоритет по сравнению с CCC/CCC, поскольку он менее специфичный. Сравните это и это преобразования. Шаблон CCC имеет меньший приоритет, чем CCC/CCC или AAA/CCC/CCC, хотя два последних имеют одинаковый приоритет. В таком случае XSLT-процессор может сообщить об ошибке. Если этого не произошло, XSLT-процессор должен выбрать среди соответствующих шаблонов тот, который будет последним в преобразовании. В этом преобразовании менее специфичный "*" имеет меньший приоритет по сравнению с CCC. Вычисленные приоритеты располагаются в диапозоне от -0.5 до 0.5. Более подробная информация содержится в Спецификации XSLT.

Атрибуты

Страница 12 | К атрибутам можно обращаться также, как и к элементам. Надо только поставить "@" перед именем атрибута.
Страница 13 | Атрибуты можно обрабатывать аналогично элементам.
Страница 14 | Вы также можете выбирать элементы, которые содержат или не содержат данный атрибут. Это преобразование включает, а это преобразование исключает элементы, если определенный элемент присутствует.

Оси

Страница 15 | Оси играют очень важную роль в XSLT. Для более подробной информации читайте XSLT reference. Сравните: ось child (это преобразование), ось descendant (это преобразование), ось parent (это преобразование), ось ancestor (это преобразование), ось following-sibling (это преобразование), ось preceding-sibling (это преобразование), ось following (это преобразование), ось preceding (это преобразование), ось attribute (это преобразование), ось namespace (это преобразование), ось self (это преобразование), ось descendant-or-self (это преобразование), ось ancestor-or-self (это преобразование).
Страница 16 | В этом примере использовались все оси.
Страница 17 | Ось child:: может быть опущена в пути адресации, так как она является осью по умолчанию. Ось attribute:: можно кратко записать в виде @. // является сокращением для /descendant-or-self::, . является синомимом для self::, а .. является сокращением для parent::.

Повторение и сортировка

Страница 18 | Инструкция xsl:for-each определяет шаблон, который применяется для каждого узла, выбранного с помощью атрибута select.
Страница 19 | Узлы, выбранные с помощью xsl:for-each (это и это преобразования) или xsl:apply-templates (это преобразование) можно отсортировать. Порядок сортировки определяется атрибутом order. В этом преобразовании проводится сортировка по возрастанию, а в этом — по убыванию.
Страница 20 | В этом преобразовании сортировка проводится в текстовом режиме, а в этом — в числовом. Обратите внимание на важную деталь. В алфавите 2 идет после 1, поэтому в текстовом режиме 2 идет после 10.
Страница 21 | В этом преобразовании при сортировке первыми идут символы верхнего регистра, а в этом — нижнего регистра.

Создание элементов и атрибутов

Страница 22 | С помощью xsl:element в процессе обработки можно создавать новые элементы. В этом преобразовании используется эта возможность, в то время как в этом точно такой же результат достигается другим, более трудоемким способом.
Страница 23 | Инструкция xsl:attribute также служит для генерирования элементов в процессе обработки. Она предназначена для создания атрибутов элемента, в который она заключена.
Страница 24 | Инструкции copy и copy-of используются для копирования узлов в результирующее дерево. Инструкция copy копирует только текущий узел без дочерних элементов и атрибутов, в то время как copy-of — все.
Страница 25 | Элемент xsl:copy может иметь атрибут use-attribute-sets. В этом случае можно определить атрибуты для копируемого элемента. Это преобразование не будет выполняться, как ожидалось (установка use-attribute-sets при помощи функции name), так как выражения в атрибутах, относящиеся к именованным XSLT-объектам не могут быть вычислены.

Условная обработка

Страница 26 | Инструкция xsl:if позволяет реализовывать условные конструкции. Это преобразование демонстрирует типичный случай использования инструкции xsl:for-each, добавляя текст между отдельными компонентами. Однако, зачастую вы не захотите добавлять текст после последнего элемента. Здесь вам может помочь инструкция xsl-if (это преобразование).
Страница 27 | Элемент xsl:choose используется для организации выбора между несколькими возможностями.
Страница 28 | Как выяснить, что некоторый текст начинается с цифры.

Создание и форматирование чисел

Страница 29 | Это преобразование демонстрирует поведение по умолчанию элемента xsl:number. Нумерация конкретных разделов зависит от позиции элемента chapter. Нумерация на каждом уровне идет независимо. Установка атрибута level равным значению "multiple" в этом преобразовании позволяет осуществить более естественную нумерацию.
Страница 30 | xsl:number вставляет отформатированные числа в выходной поток. Формат задается с помощью атрибута format. Значение атрибута начинается с идентификатора формата, сопровождаемым символами разделителей. Изучите примеры, приведенные ниже, для сравнения нотации.
Страница 31 | Это и это преобразования являются примерами форматирования многоуровневых числовых конструкций.

Переменные

Страница 32 | В Этом и этом преобразованиях демонстрируются различные способы задания xsl:variable, а в этом и в этом преобразованиях — xsl:param.
Страница 33 | Преобразование может содержать несколько переменных с одинаковыми именами. В этом преобразовании демонстрируется способ, как возвращать значение глобальной переменной, которая имеет такое же имя, как и локальная. В этом преобразовании демонстрируется неверный вариант. Область видимости локальной переменной ограничивается элементом xsl:when. Поэтому в остальной части шаблона видима только глобальная переменная.
Страница 34 | Параметры шаблону можно передать при помощи элемента xsl:with-param. Если шаблон содержит элемент xsl:param с таким же атрибутом name, что и xsl:with-param, то его значение будет использовано. Это преобразование является типичным примером. Если вы хотите передать переменную, то надо определить эту переменную при помощи элемента xsl:param. Примером неправильного подхода может служить это преобразование.
Страница 35 | Переменная может в качестве своего значения держать фрагмент результирующего дерева. Операции, допустимые на фрагменте результирующего дерева, являются подмножеством допустимых на множестве узлов. Операции допустимы на фрагменте результирующего дерева только, если эти операции будут допустимыми над строкой (операция над строкой может сначала вызывать преобразование строки в число или булевую переменную). В частности, на фрагменте результирующего дерева нельзя использовать операторы "/", "//" и "[]". Когда допустимая операция выполняется на фрагменте результирующего дерева, она выполняется точно так, как она должна была быть выполнена на эквивалентном множестве узлов. Сравните это и это преобразования.
Страница 36 | Есть тонкий момент при задании значения переменной.

Численные вычисления

Страница 37 | Функция number явным образом конвертирует свой аргумент в число. Это преобразование является примером конвертации строк, а это преобразование — примером конвертации булевских переменных true и false.
Страница 38 | Сложение, вычитание и умножение осуществляется обычным способом (это преобразование). Синтаксис для деления немного отличается от традиционного. Символ "/" зарезервирован для путей адресации и вместо него для обозначения деления используется ключевое слово div (это преобразование). Оператор mod возвращает остаток от деления нацело (это преобразование).
Страница 39 | Функция sum() суммирует все числа из выбранного множества узлов. В этом преобразовании суммируются все числа, а в этом — только нечетные.
Страница 40 | Функции ceilng(), floor() и round() преобразуют числа с плавающей запятой в целые определенным способом.
Страница 41 | Функция string() преобразует свой аргумент к строковому типу. Эта функция обычно не используется явно в преобразованиях, так как в большинстве случаев она вызывается по умолчанию. Это преобразование является примером преобразования чисел к строковому типу. Обратите внимание на результат деления на 0.
Страница 42 | Пример проверки на то, что тестовое значение является числом.

Булевые функции

Страница 43 | В этом преобразовании строки являются аргументами функции boolean(). Строка является "истиной" тогда и только тогда, когда ее длина ненулевая. В этом преобразовании текст конвертируется в числовой тип, а затем передается в качестве аргументов функции boolean(). Это преобразование показывает разницу между тем, когда "0" является числом, и когда — строкой. В этом преобразовании в качестве аргумента функции boolean() используется подмножество узлов.
Страница 44 | Функция not() возвращает "истину", если аргументом была "ложь", и "ложь" в противном случае.
Страница 45 | Функции true() и false() обычно используются для проверки некоторых условий в процессе программирования.
Страница 46 | Функция lang() возвращает "истину" или "ложь" в зависимости от того, совпадает ли язык контекстного узла с идентификатором языка, переданным ей в качестве параметра. Она действует следующим образом. Язык контекстного узла определяется значением атрибута xml:lang или, если не контекстный узел не имеет такого атрибута, значением атрибута xml:lang ближайшего предка контекстного узла. Если ни один из предков контекстного узла не имеет атрибута xml:lang, то функция lang() возвращает "ложь". Если же такой атрибут имеется, то функция lang() возвращает "истину", если значения атрибута и аргумента совпадают независимо от регистра символов, или значение атрибута имеет суффикс, начинающийся с символа "-", и его часть до суффикса совпадает со значением аргумента независимо от регистра символов.

Строковые функции

Страница 47 | Функция string() преобразует свой аргумент к строковому типу. Эта функция обычно не используется явно в преобразованиях, так как в большинстве случаев она вызывается по умолчанию. Это преобразование является примером конвертации чисел в строковой тип. Обратите внимание на результат деления на 0.
Страница 48 | Функция concat() возвращает конкатенацию своих аргументов.
Страница 49 | Функция starts-with() принимает на вход два строковых аргумента и возвращает "истину", если первая строка начинается второй, и "ложь" в противном случае. Функция contains() также принимает на вход два строковых аргумента и возвращает "истину", если первая строка содержит вторую, и "ложь" в противном случае.
Страница 50 | Функции substring-before() и substring-after() находят в первой строке вторую. Первая из них возвращает подстроку, которая ей предшествует, а вторая — подстроку, котороя за ней следует.Функция substring() возвращает подстроку переданного ей строкового аргумента, начинающуюся с позиции, определенной вторым аргументом, и длиной, определенной в третьем аргументе. Если третий аргумент опущен, то она возвращает подстрока продолжается до конца строки. Позицией первого символа является 1 (это преобразование). Это преобразование демонстрирует ситуацию, когда некоторые аргументы выходят за допустимый диапазон или не являются целыми. Возращаемая строка содержит те символы, для которых позиция больше или равна, чем значение второго аргумента и, если третий аргумент определен, меньше, чем сумма значений второго и третьего аргументов.
Страница 51 | Функция string-length() возвращает количество символов в строке. Функция normalize-space() производит так называемую нормализацию строкового аргумента относительно пробелов. Она удаляет пробелы в начале и в конце строки, а все последовательности пробелов в теле строки заменяются одиночным пробелом.
Страница 52 | Функция translate() возвращает строку из первого аргумента, в которой символы из второго строкового аргумента в соответствии с их позицией заменены на символы из третьего строкового аргумента. Если какой-либо символ встречается во втором аргументе более, чем один раз, то учитывается только первое его появление. Если строка из третьего аргумента длиннее, чем строка из второго аргумента, то остаток строки игнорируется.

Функции множеств узлов

Страница 53 | Функция position() возвращает позицию контекста — число, равное порядковому номеру контекстного узла в обрабатываемом в данный момент множестве. Функция last() возвращает размер контекста — число, равное количеству узлов в обрабатываемом множестве. Это преобразование является демонстрацией использования этих функций в некоторых контекстах. В этом преобразовании демонстрируется действие этих функций на отсортированные и неотсортированные множества узлов внутри элемента xsl:for-each.
Страница 54 | Функция count() возвращает количество узлов в множестве, переданном ей в качестве аргумента.
Страница 55 | Функция id() позволяет обращаться к элементам по значениям их уникальных идентификаторов. Это преобразование является простым примером ее использования. Тщательно изучите это преобразование. Содержание элемента title не отображается внутри квадратных скобок, так как в DTD его атрибут id определен как CDATA, а не как ID. Одновременно можно обрабатывать несколько идентификаторов (это преобразование).
Страница 56 | Пример использования функции id().
Страница 57 | Функции name(), local-name() и namespace-uri() используются для получения информации имени элемента или атрибута и пространстве имен.

Вывод

Страница 58 | Элемент xsl:output позволяет авторам преобразований определять, в каком виде должно быть представлено результирующее дерево. Если XSLT-процессор выводит результирующее дерево, то он должен делать это в точности так, как определено элементом xsl:output. Элемент xsl:output является элементом только верхнего уровня. В этом преобразовании используется метод вывода "html", а в этом — "xml". Сравните вывод пустых элементов.
Страница 59 | Если элемент xml:output отсутствует, то по умолчанию методом вывода будет "xml" (это преобразование), однако, если корневой элемент выходного документа имеет значение "html" (независимо от регистра символов), то методом вывода будет "html" (это преобразование).
Страница 60 | Метод вывода "html" для пустых элементов, определенных спецификацией HTML, выводит тэги без косой черты после имени и закрывающих тэгов. Также при использовании этого метода вывода процессор не должен анализировать содержимое элементов script и style. Сравните с этим преобразованием. Для получения более подробной информации обратитесь к Спецификации XSLT.
Страница 61 | Атрибут encoding определяет, какая кодировка предпочтительна для выходящего документа. Метод вывода "html" должен добавить непосредственно за открывающим тэгом элемента HEAD элемент META с определением используемой кодировки. Это преобразование использует для вывода кодировку UTF-8, это преобразование — UTF-16, а это — Cp1250.
Страница 62 | Метод вывода "text" выводит результирующее дерево посредством вывода строковых значений каждого текстового узла в порядке следования в документе без каких-либо изменений.

Копирование

Страница 63 | Инструкции copy и copy-of используются для копирования узлов в результирующее дерево. Инструкция copy копирует только текущий узел без дочерних элементов и атрибутов, в то время как copy-of — все.
Страница 64 | Элемент xsl:copy может иметь атрибут use-attribute-sets. В этом случае можно определить атрибуты для копируемого элемента. Это преобразование не будет выполняться, как ожидалось (установка use-attribute-sets при помощи функции name), так как выражения в атрибутах, относящиеся к именованным XSLT-объектам не могут быть вычислены.

Дополнительные функции

Страница 65 | Функция current() возвращает множество, состоящее только из текущего узла преобразования. Для наиболее удаленых выражений (выражений, не встречающихся внутри других выражений), текущий узел всегда совпадает с узлом контекста. Однако, внутри квадратных скобок обычно они являются двумя различными узлами.
Страница 66 | Функция generate-id() используется для создания уникального идентификатора, отвечающего Спецификации XML. Это преобразование использует эту функцию для добавления идентификатора ко всем элементам исходного XML.

Комбинирование преобразований

Страница 67 | В преобразование можно импортировать (xsl:import) и включать (xsl:include) внешните файлы преобразований. Импортирование почти полностью аналогично включению за исключением того, что определения и шаблоны в основном файле имеют превосходство над шаблонами и определениями в импортируемых файлах. Это и это преобразования импортируются или включаются в остальные.
Страница 68 | В это преобразование включается это, в которое, в свою очередь, импортируется это преобразование.
Страница 69 | Другие примеры использования xsl:include и xsl:import.
Страница 70 | Вы можете использовать элемент xsl:apply-imports для использования импортированных шаблонов, чье поведение, однако, вы можете изменить. В это преобразование импортируется это, а его шаблоны аннулируются. Это преобразование импортирует это и изменяет его шаблоны. Инструкция xsl:apply-imports работает только для шаблонов импортированных с помощью xsl:import, а не включенных с помощью xsl:include (это преобразование).
Страница 71 | Превосходство при импорте сильней, чем превосходство приоритета. Смотрите это преобразование.