получить атрибут xml с именем xlink:href, используя xsl

Как я могу получить значение атрибута с именем xlink:href узла xml в шаблоне xsl?

У меня есть этот xml-узел:

<DCPType>
 <HTTP>
  <Get>
   <OnlineResource test="hello" xlink:href="http://localhost/wms/default.aspx" 
      xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" />
  </Get>
 </HTTP>
</DCPType>

Когда я пытаюсь использовать следующий xsl, я получаю сообщение об ошибке «Префикс« xlink »не определен». :

<xsl:value-of select="DCPType/HTTP/Get/OnlineResource/@xlink:href" />

Когда я пробую этот простой атрибут, он работает:

<xsl:value-of select="DCPType/HTTP/Get/OnlineResource/@test" />

person awe    schedule 06.05.2010    source источник
comment
Хороший вопрос (+1). Смотрите мой ответ для альтернативного решения. :)   -  person Dimitre Novatchev    schedule 06.05.2010


Ответы (2)


Вам необходимо объявить пространство имен XLINK в XSLT, прежде чем вы сможете ссылаться на него.

Вы можете добавить его к элементу xsl:value-of:

<xsl:value-of select="DCPType/HTTP/Get/OnlineResource/@xlink:href" xmlns:xlink="http://www.w3.org/1999/xlink" />

Однако, если вам понадобится ссылаться на него в других областях вашей таблицы стилей, будет проще объявить его вверху в элементе документа вашего XSLT:

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

Между прочим, вам не нужно использовать тот же префикс пространства имен в вашей таблице стилей, что и в вашем XML. Префикс пространства имен используется просто как сокращение для URI пространства имен. Вы можете объявить и использовать пространство имен XLINK следующим образом:

<xsl:value-of select="DCPType/HTTP/Get/OnlineResource/@x-link:href"  xmlns:x-link="http://www.w3.org/1999/xlink"/>
person Mads Hansen    schedule 06.05.2010
comment
Я использую включение в верхний элемент, так как потенциально буду использовать это более чем в одном месте в xls. - person awe; 12.05.2010

Хотя @Mads-Hansen предоставил хороший ответ, полезно знать, что существует альтернативный способ ссылки на имена, которые находятся в пространстве имен:

В этом случае вы также можете получить доступ к атрибуту с помощью следующего выражения XPath:

   DCPType/HTTP/Get/OnlineResource/@*
            [namespace-uri() = 'http://www.w3.org/1999/xlink']
person Dimitre Novatchev    schedule 06.05.2010