Выберите атрибут XML-узла в пространстве имен с помощью XSL - PullRequest
1 голос
/ 19 августа 2010

У меня есть следующий XML, и я пытаюсь получить ссылку на медиа: миниатюру и медиа: атрибуты URL контента, используя оператор 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 />

1 Ответ

2 голосов
/ 19 августа 2010

Я попробовал ваши примеры кода с помощью 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(.)='']"> для выбора только элементов без определения пространства имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...