1. Главная
  2. Функции XPath
  3. base-uri()

base-uri XPath

Become a Patron!

Возвращает базовый URI-адрес для заданного узла.

Синтаксис

xs:anyURI? base-uri(node()?)
xs:anyURI? base-uri()

Ввод

Узел. Без аргумента base-uri() возвращает базовый URI-адрес контекстного объекта.

Вывод

Базовый URI-адрес заданного узла.

Функция base-uri() работает в соответствии со спецификацией XML Base. По умолчанию базовый URI-адрес является URI-адресом самого документа XML, но документ может изменить это значение при помощи атрибута xml:base любого элемента.

Если заданный узел не имеет свойства базового URI-адреса, но имеет родителя, base-uri() просматривает его предков. Функция пытается найти базовый URI-адрес родителя узла, потом родителя его родителя и т. д., пока не найдет свойство с базовым URI-адресом или не достигнет узла, не имеющего родителя. Если свойство найти так и не удается, base-uri() возвращает пустую последовательность. Если аргумент base-uri() является пустой последовательностью, функция возвращает пустую последовательность.

Описание и примеры

Где определяется

XQuery 1.0 and XPath 2.0 Functions and Operators, раздел 2 «Accessors».

Пример

В качестве исходного XML-документа будет использоваться видоизмененная версия списка автомашин. Обратите внимание: все элементы <manufacturer> используют атрибут xml:base для определения нового базового URI-адреса:

<?xml version="1.0" encoding="utf-8"?>
<!-- xmlbase.xml -->
<cars>
    <manufacturer name="Chevrolet" xml:base="http://www.chevrolet.com/">
        <car>Cavalier</car>
        <car>Corvette</car>
        <car>Impala</car>
        <car>Malibu</car>
    </manufacturer>
    <manufacturer name="Ford" xml:base="http://www.ford.com/">
        <car>Pinto</car>
        <car>Mustang</car>
        <car>Taurus</car>
    </manufacturer>
    <manufacturer name="Volkswagen" xml:base="http://www.vw.com/">
        <car>Beetle</car>
        <car>Jetta</car>
        <car>Passat</car>
        <car>Touraeg</car>
    </manufacturer>
</cars>

Для тестирования функции base-uri() будет использоваться следующая таблица стилей:

<?xml version="1.0"?>
<!-- base-uri.xsl -->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="/">
        <xsl:text>&#xA;Tests of the base-uri() function:</xsl:text>
        <xsl:text>&#xA;&#xA; The base URI for the </xsl:text>
        <xsl:text>document root is:&#xA; </xsl:text>
        <xsl:value-of select="base-uri()"/>
        <xsl:text>&#xA;&#xA; The base URI for the </xsl:text>
        <xsl:text>&lt;cars&gt; element is:&#xA; </xsl:text>
        <xsl:value-of select="base-uri(cars)"/>
        <xsl:for-each select="/cars/manufacturer">
            <xsl:text>&#xA;&#xA; The base URI for the </xsl:text>
            <xsl:text>manufacturer named </xsl:text>
            <xsl:value-of select="@name"/>
            <xsl:text>: &#xA; </xsl:text>
            <xsl:value-of select="base-uri()"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Применение этой таблицы стилей к измененному списку автомашин дает следующий результат:

Tests of the base-uri() function:
The base URI for the document root is:
file:/C:/projects/XSLTbookV2/AppendixC/xmlbase.xml
The base URI for the <cars> element is:
file:/C:/projects/XSLTbookV2/AppendixC/xmlbase.xml
The base URI for the manufacturer named Chevrolet:
http://www.chevrolet.com/
The base URI for the manufacturer named Ford:
http://www.ford.com/
The base URI for the manufacturer named Volkswagen:
http://www.vw.com/

Функция base-uri() особенно полезна при построении ссылок на основе документа XML. Следующая таблица стилей создает ссылки для элементов <car> с использованием функции base-uri():

<?xml version="1.0"?>
<!-- base-uri2.xsl -->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" include-content-type="no"/>
    <xsl:template match="/">
        <html>
            <head>
                <title>Here are some cars</title>
            </head>
            <body>
                <h1>Here are some cars:</h1>
                <xsl:apply-templates select="cars/manufacturer"/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="manufacturer">
        <h2>
            <xsl:value-of select="@name"/>
        </h2>
        <ul>
            <xsl:for-each select="car">
                <li>
                    <a href="{concat(base-uri(), ., '.html')}">
                        <xsl:value-of select="."/>
                    </a>
                </li>
            </xsl:for-each>
        </ul>
    </xsl:template>
</xsl:stylesheet>

При построении ссылок используются шаблон значения атрибута и функция concat(), объединяющая значение базового URI-адреса, значение текущего элемента (точка представляет элемент <car>, обрабатываемый в настоящий момент) и строку .html. Сгенерированная серия ссылок выглядит примерно так:

<h2>Volkswagen</h2>
<ul>
    <li><a href="http://www.vw.com/Beetle.html">Beetle</a></li>
    <li><a href="http://www.vw.com/Jetta.html">Jetta</a></li>
    <li><a href="http://www.vw.com/Passat.html">Passat</a></li>
    <li><a href="http://www.vw.com/Touraeg.html">Touraeg</a></li>
</ul>

Предполагается, что свойство базового URI-адреса завершается косой чертой, как во всех атрибутах xml:base исходного документа. Вероятно, для повышения надежности кода следовало бы проверить возвращаемое значение функции base-uri() и при необходимости присоединить к нему косую черту.