<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>&#xA;This is a test of the &lt;xsl:import-</xsl:text>
        <xsl:text>schema&gt; element.&#xA;&#xA;</xsl:text>
        <xsl:text>Here are all the items in this purchase </xsl:text>
        <xsl:text>order:&#xA;</xsl:text>
        <xsl:for-each select="po:items/po:item">
            <xsl:text> * </xsl:text>
            <xsl:value-of select="po:partname"/>
            <xsl:text>&#xA;</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>&#xA;This is a test of the <xsl:import-</xsl:text>
        <xsl:text>schema> element.&#xA;&#xA;</xsl:text>
        <xsl:text>Here are all the items in this purchase </xsl:text>
        <xsl:text>order:&#xA;</xsl:text>
        <xsl:for-each select="po:items/po:item">
            <xsl:text> * </xsl:text>
            <xsl:value-of select="po:partname"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>