Выберите атрибут узла XML в пространстве имен с помощью XSL

У меня есть следующий XML-код, и я пытаюсь получить ссылку на атрибуты URL-адреса media: thumbnail и media: content с помощью оператора value-of в XSL. Я могу получить заголовок, ссылку, описание и т. Д., Но не медиаузлы и их атрибуты (URL-адрес, ширина, высота для эскиза и URL-адреса, среда, тип, ширина и высота для группы).

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
<channel>
   <item>
      <title>My Title</title>
      <link>http://MyLink.com</link>
      <description>My description</description>
      <pubDate>Wed, 18 Aug 2010 18:31:24 UTC</pubDate>
      <media:thumbnail url="MyLink.com/Thumbnail.gif" width="80" height="80" />
      <media:group>
         <media:content url="http://MyLink.com/image1.gif" medium="image" type="image/jpeg" width="80" height="80"  />
         <media:content url="http://MyLink.com/image2.gif" medium="image" type="image/jpeg" width="30" height="30"  />
      </media:group>
   </item>
</channel>
</rss>

Вот мой XSL ...

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:media="http://search.yahoo.com/mrss/">

 <xsl:template match="rss">

 <xsl:for-each select="channel/item/*">
    <xsl:value-of select="name()"/><br />

 <!-- What goes here to display Media:Thumbnail @URL and Media:Content @URL ? -->

 </xsl:for-each>

 </xsl:template>
</xsl:stylesheet>

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

title<br />
link<br />
description<br />
pubDate<br />

person pdavis    schedule 18.08.2010    source источник
comment
Не могли бы вы уточнить, как на самом деле должен выглядеть результат? Образец документа будет лучше всего.   -  person Dirk Vollmar    schedule 19.08.2010
comment
Я попытался подробнее прояснить вопрос. В основном я пытаюсь получить значения атрибутов медиаузлов.   -  person pdavis    schedule 19.08.2010
comment
Какой механизм XSLT вы используете? Для меня это похоже на ошибку, потому что media:thumbnail<br/>media:group<br/> должен появиться в выводе (и действительно появляется, когда я пробую).   -  person Dirk Vollmar    schedule 19.08.2010


Ответы (1)


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

Вы можете использовать тест узла в форме namespace-prefix:*, чтобы выбрать все элементы в определенном пространстве имен, и символ вертикальной черты |, чтобы получить объединение путей выбора. Итак, в этом случае для каждой строки

<xsl:for-each select="channel/item/* | channel/item/media:*">

должен делать то, что хотел. Обратите внимание, что префикс не обязательно должен совпадать с префиксом, используемым в XML-документе, но он должен соответствовать префиксу, определенному в вашем XSLT-документе.

Если бы проблема была противоположной, можно было бы использовать выбор
channel/item/*[not(self::media:*)], чтобы исключить нежелательное пространство имен, или использовать выбор
<xsl:for-each select="channel/item/*[namespace-uri(.)='']">, чтобы выбрать только элементы без определения пространства имен.

person jasso    schedule 19.08.2010