<xsl:import-schema> XSLT
Элемент xsl:import-schema
импортирует документ XML Schema. Импортирование и обработка схемы предшествует какой-либо обработке входных документов. Это позволяет определять типы данных и правила проверки до того, как процессор XSLT приступит к преобразованию входного документа. Элемент поддерживается только схемосовместимыми процессорами XSLT 2.0.
Элементы-родители:
Синтаксис
XSLT 2.0 и XSLT 3.0
<xsl:import-schema
namespace? = uri-reference
schema-location? = uri-reference>
<!-- Content: xs:schema? -->
</xsl:import-schema>
Атрибуты
-
namespace
— необязательный атрибут, пространство имен, используемое импортированной схемой. Любые шаблоны и функции XPath могут использовать это пространство имен, указывая тем самым, что элемент или значение определяется этой схемой. -
schema-location
— необязательный атрибут, URI-ссылка на документ схемы. Если таблица стилей импортирует схему и использует ее, неудача при поиске схемы приводит к фатальной ошибке. Если схема только импортируется, но не используется, процессору XSLT разрешается проигнорировать ошибку. Элемент<xsl:import-schema>
может включать элемент<xs:schema>
. Если элемент<xsl:import-schema>
содержит<xs:schema>
одновременно с атрибутомschema-location
, происходит фатальная ошибка.
Описание и примеры
Пример 1
Для демонстрации применения <xsl:import-schema>
будет использована схема заказов. Действительный заказ выглядит примерно так:
<?xml version="1.0"?>
<!-- good-po.xml -->
<purchase-order id="38292" xmlns="http://www.oreilly.com/xslt">
<date year="2001" month="6" day="19"/>
<customer id="4738" level="Platinum">
<address type="business">
<name>
<title>Mr.</title>
<first-name>Chester Hasbrouck</first-name>
<last-name>Frisby</last-name>
</name>
<street>1234 Main Street</street>
<city>Sheboygan</city>
<state>WI</state>
<zip>48392</zip>
</address>
</customer>
<items>
<item part-no="28392-33-TT">
<partname>Turnip Twaddler</partname>
<qty>3</qty>
<price>9.95</price>
</item>
<item part-no="28100-38-CT">
<partname>Clam Teaser</partname>
<qty>7</qty>
<price>39.95</price>
</item>
</items>
</purchase-order>
Теперь воспользуемся элементом <xsl:import-schema>
для чтения файла схемы и документа XML. Он проверит, является ли документ XML экземпляром элемента <po:purchase-order>
, определяемого в схеме:
<?xml version="1.0"?>
<!-- import-schema.xsl -->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:po="http://www.oreilly.com/xslt">
<xsl:import-schema namespace="http://www.oreilly.com/xslt" schema-location="po.xsd" />
<xsl:output method="text"/>
<xsl:template match="schema-element(po:purchase-order)">
<xsl:text>
This is a test of the <xsl:import-</xsl:text>
<xsl:text>schema> element.

</xsl:text>
<xsl:text>Here are all the items in this purchase </xsl:text>
<xsl:text>order:
</xsl:text>
<xsl:for-each select="po:items/po:item">
<xsl:text> * </xsl:text>
<xsl:value-of select="po:partname"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Обратите внимание: помимо импортирования схемы в атрибуте match
используется проверка узла schema-element
. Это означает, что шаблон совпадает только с элементами <po:purchase-order>
, проверенными на действительность. Результат:
This is a test of the <xsl:import-schema> element.
Here are all the items in this purchase order:
* Turnip Twaddler
* Clam Teaser
В самой схеме атрибут targetNamespace
и пространство имен по умолчанию (xmlns=
) соответствуют атрибуту namespace элемента <xsl:import-schema>
в таблице стилей. Для ссылок на элементы в заказе мы связываем префикс po
с этим пространством имен.
Каждый раз, когда требуется сослаться на элементы из пространства имен заказов, мы указываем префикс (например, po:purchase-order
). Если URI-адреса пространств имен не совпадают, таблица стилей работать не будет.
Пример 2
Далее приводится альтернативная версия таблицы стилей, в которой элемент <xsl:import-schema>
содержит саму схему. Эта версия выдает такие же результаты, что и предыдущая:
<?xml version="1.0"?>
<!-- import-schema2.xsl -->
<xsl:stylesheet version="2.0" xmlns="http://www.oreilly.com/xslt" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:po="http://www.oreilly.com/xslt" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:import-schema namespace="http://www.oreilly.com/xslt">
<xs:schema targetNamespace="http://www.oreilly.com/xslt" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="purchase-order">
<xs:complexType>
<xs:sequence>
<xs:element ref="date" minOccurs="1" maxOccurs="1"/>
<xs:element ref="customer" minOccurs="1" maxOccurs="1"/>
<xs:element ref="items" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="id" type="xs:string"/>
</xs:complexType>
</xs:element>
...
</xs:schema>
</xsl:import-schema>
<xsl:output method="text"/>
<xsl:template match="schema-element(po:purchase-order)">
<xsl:text>
This is a test of the <xsl:import-</xsl:text>
<xsl:text>schema> element.

</xsl:text>
<xsl:text>Here are all the items in this purchase </xsl:text>
<xsl:text>order:
</xsl:text>
<xsl:for-each select="po:items/po:item">
<xsl:text> * </xsl:text>
<xsl:value-of select="po:partname"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>