2010-03-21 4 views
2

Salut, je veux work around a 'bug' in certain RSS-feeds, qui utilise un espace de noms incorrect pour le module MediaRSS. J'ai essayé de le faire en manipulant le DOM par programme, mais l'utilisation de XSLT me semble plus flexible.Remplacement d'un espace de noms avec XSLT

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

Lorsque l'espace de noms doit être http://search.yahoo.com/mrss/ (l'esprit la barre oblique).

Ceci est mon 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> 

Malheureusement, le résultat de la transformation est un XML non valide et mon RSS-Parser (ROME Library) ne pas analyser l'alimentation plus:

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 

Qu'est-ce mal avec ma feuille de style?

Répondre

1

Vous avez la moitié de la solution dans votre feuille de style.

Vous avez mis dans un modèle pour correspondre (et corriger) les éléments avec le mauvais espace de noms Media RSS, mais vous n'avez rien à faire correspondre aux autres éléments/attributs dans le flux RSS.

Le built-in template rules assortissent le reste du document, les noeuds qui ne copie que les nœuds texte dans la sortie. Cela ne préserve pas le XML du flux RSS d'origine et produit une sortie qui n'est pas une structure XML RSS valide. Modèle ajoutera un identity transform afin que les autres noeuds et attributs soient copiés dans la sortie et préservent le contenu/la structure du document.

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

OK. Je dois absolument investir plus de temps dans XSL/XPATH etc! – er4z0r