2 Stimmen

Ersetzen eines Namensraumes mit XSLT

Hallo, ich möchte Umgehung eines "Bugs" in bestimmten RSS-Feeds die einen falschen Namespace für das mediaRSS-Modul verwenden. Ich habe versucht, es zu tun, indem ich das DOM programmatisch manipuliere, aber die Verwendung von XSLT scheint mir flexibler zu sein.

Exemple :

<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" />

Wo der Namensraum sein muss http://search.yahoo.com/mrss/ (beachten Sie den Schrägstrich).

Dies ist mein Stylesheet:

<?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>

Leider ist das Ergebnis der Transformation ein ungültiges XML und mein RSS-Parser ( ROME-Bibliothek ) parst den Feed nicht mehr:

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

Was ist mit meinem Stylesheet nicht in Ordnung?

1voto

Mads Hansen Punkte 58777

Sie haben die Hälfte der Lösung in Ihrem Stylesheet.

Sie haben eine Schablone eingefügt, um die Elemente mit dem falschen Namen zu finden (und zu korrigieren). Medien-RSS Namespace, aber Sie haben nichts, was mit den anderen Elementen/Attributen im RSS-Feed übereinstimmt.

En integrierte Vorlagenregeln mit dem Rest der Dokumentknoten übereinstimmen, wodurch nur die Textknoten in die Ausgabe kopiert werden. Dadurch wird die XML-Struktur des ursprünglichen RSS-Feeds nicht beibehalten und die Ausgabe ist keine gültige RSS-XML-Struktur.

Hinzufügen eines Identitätstransformation Vorlage wird sichergestellt, dass die anderen Knoten und Attribute in die Ausgabe kopiert werden und der Inhalt/die Struktur des Dokuments erhalten bleibt.

<?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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X