Основы XML — пространства имен

Logo
Основы XML - пространства имен

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

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

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

Стоит заметить, что не обязательно, чтобы по этому адресу что-то находилось. Обработчик не будет переходить по ссылке и проверять наличие какой-либо информации. Она используется чисто как уникальный идентификатор, а поскольку это еще и URL своего ресурса, то вряд ли кто-то будет использовать его в качестве идентификатора для своей схемы.

Итак, с теорией мы разобрались. Теперь давайте перейдем непосредственно к рассмотрению префиксов пространств имен и примеров правильного их использования.

Префиксы пространств имен XML. Примеры использования пространств имен в XML и XSLT

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

<префикс:элемент xmlns:префикс="URI">
  ...
</префикс:элемент>

Как видно с примера, префиксы пространств имен задаются как атрибуты с именами, которые начинаются последовательностью xmlns. Если говорить об XSLT, то там чаще всего используется префикс xsl. На практике все это выглядит следующим образом.

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  ...
</xsl:stylesheet>

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

<ddd:stylesheet
  xmlns:ddd="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  ...
</ddd:stylesheet>

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

<!-- Еще нельзя использовать префикс yyy -->
<yyy:element xmlns:yyy="http://yyy.com/xml">
  <!-- Здесь можно использовать префикс yyy -->
  <yyy:anyelement>any content</yyy:anyelement>
  ...
</yyy:element>
<!-- Уже нельзя использовать префикс yyy -->

Еще один момент, на который стоит обратить внимание, это то, что сами префиксы не определяют элемент к той или иной схеме. Это делают уникальные идентификаторы, которые поставлены в соответствие этим префиксам. Таким образом, два элемента с разными префиксами которым заданы одинаковые идентификаторы будут считаться принадлежащими к одной схеме. Чтобы продемонстрировать это, рассмотрим следующий пример.

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xslt:text xmlns:xslt="http://www.w3.org/1999/XSL/Transform">Any text</xslt:text>
  ...
</xsl:stylesheet>

Несмотря на то, что элементы stylesheet и text имеют разные префиксы, они принадлежат одной схеме, так как их префиксам проставлены в соответствие одинаковые идентификаторы. Таким образом, в документе может использоваться любое количество префиксов пространств имен. Зачастую все они определяются в корневом элементе, а потом просто используются в нужном месте документа. И опять еще один пример для демонстрации.

<xsl:element
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xslt="http://xslt.com/xslt"
  xmlns:xlt="http://xlt.com/xlt">
  <xsl:anyelement />
  <xslt:anyelement />
  <xlt:anyelement />
  ...
</xsl:element>

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

<xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <firstelement>Any content</firstelement>
  <xslt:secondelement xmlns:xslt="http://xslt.com/xslt">Any content</xslt:secondelement>
  <xlt:thirdelement xmlns:xlt="http://xlt.com/xlt">
    <one>Any content</one>
    <two>Any content</two>
  </xlt:thirdelement>
  ...
</xsl:element>

Здесь стоит обратить внимание, что элементы one и two будут принадлежать пространству имен элемента thirdelement, так как он является для них родительским. Как видим, здесь прослеживается так называемое наследование. Если для элемента не указано пространство имен, то ему автоматически присваивается пространство имен ближайшего родительского элемента.

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

<xsl:element
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xslt="http://xslt.com/xslt"
  xmlns:xlt="http://xlt.com/xlt">
  <xsl:firstelement>Any content</xsl:firstelement>
  <xslt:secondelement>Any content</xslt:secondelement>
  <xlt:thirdelement>
    <xlt:one>Any content</xlt:one>
    <xlt:two>Any content</xlt:two>
  </xlt:thirdelement>
  ...
</xsl:element>

На этом мы заканчиваем рассмотрение пространств имен и в следующей статье поговорим об основных моментах описания структуры XML-документов при помощи DTD. Если вы не хотите пропустить выпуска новых статей, рекомендую подписаться на новостную рассылку, воспользовавшись формой подписки ниже.

На этом все. Удачи вам и успехов в изучении XML.

Обнаружили ошибку? Выделите ее и нажмите Ctrl+Enter

Комментарии 2

  • sergeystets

    <ddd:stylesheet
    &nbsp;&nbsp;xmlns:xsl="http://www.w3.org/1999/XSL/Transform&quot;
    &nbsp;&nbsp;version="1.0">
    &nbsp;&nbsp;…
    </ddd:stylesheet>

    Как Вы можете использовать префикс ddd, если он даже не объявлен?

  • Дмитрий

    Очепятка:) xsl нужно заменить на ddd, как и xsl на yyy. Когда создавал примеры немного проглядел этот момент. Уже исправил. Больше опечаток быть не должно. Спасибо, что сообщили об ошибке!

Оставить комментарий

отменить ответ