Замена пространства имен с помощью XSLT - PullRequest
2 голосов
/ 21 марта 2010

Здравствуйте, я хочу обойти 'ошибку' в некоторых RSS-лентах , которые используют неправильное пространство имен для модуля mediaRSS. Я пытался сделать это, манипулируя DOM программно, но использование XSLT мне кажется более гибким.

Пример:

<media:thumbnail xmlns:media="http://search.yahoo.com/mrss" url="http://www.suedkurier.de/storage/pic/dpa/infoline/brennpunkte/4311018_0_merkelxI_24280028_original.large-4-3-800-199-0-3131-2202.jpg" />
<media:thumbnail url="http://www.suedkurier.de/storage/pic/dpa/infoline/brennpunkte/4311018_0_merkelxI_24280028_original.large-4-3-800-199-0-3131-2202.jpg" />

Где пространство имен должно быть http://search.yahoo.com/mrss/ (обратите внимание на косую черту).

Это моя таблица стилей:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="//*[namespace-uri()='http://search.yahoo.com/mrss']">
        <xsl:element name="{local-name()}" namespace="http://search.yahoo.com/mrss/" >
            <xsl:apply-templates select="@*|*|text()" />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

К сожалению, результатом преобразования является неверный XML, и мой RSS-парсер ( Библиотека ROME ) больше не анализирует фид:

java.lang.IllegalStateException: Root element not set
    at org.jdom.Document.getRootElement(Document.java:218)
    at com.sun.syndication.io.impl.RSS090Parser.isMyType(RSS090Parser.java:58)
    at com.sun.syndication.io.impl.FeedParsers.getParserFor(FeedParsers.java:72)
    at com.sun.syndication.io.WireFeedInput.build(WireFeedInput.java:273)
    at com.sun.syndication.io.WireFeedInput.build(WireFeedInput.java:251)
    ... 8 more

Что не так с моей таблицей стилей?

1 Ответ

1 голос
/ 21 марта 2010

У вас есть половина решения в вашей таблице стилей.

Вы вставили шаблон для сопоставления (и исправления) элементов с неправильным пространством имен Media RSS , но у вас нет ничего, чтобы соответствовать другим элементам / атрибутам в RSSкормить.

Встроенные правила шаблона соответствуют остальным узлам документа, что будет копировать только текстовые узлы в вывод.Это не сохраняет исходный XML-канал RSS и приводит к выводу, который не является допустимой XML-структурой RSS.

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

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!--identity transform that will copy matched node/attribute to the output and apply templates for it's children and attached attributes-->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="@*|*|text()" />
        </xsl:copy>
    </xsl:template>

    <!--Specialized template to match on elements with the incorrect namespace and generate a new element-->
    <xsl:template match="//*[namespace-uri()='http://search.yahoo.com/mrss']">
        <xsl:element name="{local-name()}" namespace="http://search.yahoo.com/mrss/" >
            <xsl:apply-templates select="@*|*|text()" />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...