2010-03-21 5 views
2

안녕하세요 work around a 'bug' in certain RSS-feeds에 mediaRSS 모듈에 대해 잘못된 네임 스페이스를 사용하고 싶습니다. 프로그래밍 방식으로 DOM을 조작하여이 작업을 시도했지만 XSLT를 사용하면 더욱 유연 해 보입니다.네임 스페이스를 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 Library가) 더 이상 피드를 구문 분석하지 않습니다 :

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

귀하의 스타일 시트에 절반의 솔루션이 있습니다.

틀린 Media RSS 네임 스페이스를 사용하여 요소를 일치 (및 수정)하기 위해 템플릿을 넣었지만 RSS 피드의 다른 요소/특성과 일치시킬 내용이 없습니다.

built-in template rules은 텍스트 노드 만 출력으로 복사하는 나머지 문서 노드와 일치합니다. 이는 원본 RSS 피드의 XML을 보존하지 않으며 올바른 RSS XML 구조가 아닌 출력을 생성합니다.

identity transform 템플릿을 추가하면 다른 노드와 특성이 출력에 복사되어 문서 내용/구조가 보존됩니다.

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

확인. 나는 확실히 XSL/XPATH에 더 많은 시간을 투자 할 필요가있다! – er4z0r

관련 문제