2013-08-30 24 views
113

Podczas przetwarzania mój XML Próbuję skopiować plik SVG odwołanie od atrybutu href bezpośrednio do mojego wyjścia HTML z następującą linię:Korzystanie z kopiowaniem z dokumentu(), aby dodać pomostów żylnych na wyjściu XHTML

<xsl:copy-of copy-namespaces="yes" select="document(@href)"/> 

Nie powinno być konieczne copy-namespaces, ponieważ domyślną wartością jest "tak", ale dodałem ją, aby zapobiec pytaniu o to, czy ją wypróbowałem, czy nie.

Pliki są kopiowane do kodu HTML, ale wszystkie elementy z wpisanymi na klawiaturze są wstawiane. Na przykład, plik, który wygląda jak ten przed skopiowaniem:

<rdf:RDF> 
     <cc:Work rdf:about=""> 
     <dc:format>image/svg+xml</dc:format> 
     <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> 
     <dc:title/> 
     </cc:Work> 
    </rdf:RDF> 
    </metadata> 
    <g transform="translate(-519.21143,-667.79077)" id="layer1"> 
    <image xlink:href="data:image/png;base64 

Wygląda to potem:

<_0:RDF xmlns:_0="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
     <_0:Work xmlns:_0="http://creativecommons.org/ns#" about=""> 
     <_0:format xmlns:_0="http://purl.org/dc/elements/1.1/">image/svg+xml</_0:format> 
     <_0:type xmlns:_0="http://purl.org/dc/elements/1.1/" resource="http://purl.org/dc/dcmitype/StillImage"/> 
     <_0:title xmlns:_0="http://purl.org/dc/elements/1.1/"/> 
     </_0:Work> 
    </_0:RDF> 
    </metadata> 
    <g id="layer1" transform="translate(-519.21143,-667.79077)"> 
    <image href="data:image/png;base64 

Brakujące xlink nazw na wartość href elementu obrazu jest szczególnie problematyczne.

Jakieś przemyślenia na temat tego, w jaki sposób mogę zrobić to inaczej, aby przeczytać w pliku SVG bez jakiejkolwiek interpretacji?

Znalazłem jedno rozwiązanie, że „działa”, ale jest to hack i chciałbym coś bardziej eleganckie:

<xsl:template name="topic-image-svg"> 
    <!-- Generate tags to embed SWFs --> 
    <xsl:element name="div"> 
     <xsl:if test="@width"> 
     <xsl:attribute name="width"> 
      <xsl:value-of select="@width"/> 
     </xsl:attribute> 
     </xsl:if> 
     <xsl:if test="@height"> 
     <xsl:attribute name="height"> 
      <xsl:value-of select="@height"/> 
     </xsl:attribute> 
     </xsl:if>  
     <xsl:apply-templates select="document(@href)" mode="svg"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="*" mode="svg"> 
    <xsl:copy copy-namespaces="yes"> 
     <xsl:for-each select="@*"> 
     <xsl:choose> 
      <xsl:when test="self::node()[name() = 'xlink:href']"> 
      <xsl:attribute name="xlink:href"><xsl:value-of select="."></xsl:value-of></xsl:attribute> 
      </xsl:when> 
      <xsl:otherwise> 
      <xsl:copy></xsl:copy> 
      </xsl:otherwise> 
     </xsl:choose> 
     </xsl:for-each> 
    <xsl:apply-templates mode="svg"></xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 
+5

Czy Twój arkusz stylów ma wszystkie przestrzenie nazw deklarowane w głównym znaczniku? – PhillyNJ

+0

Tak, to była moja pierwsza myśl. – jrhooker

+6

Czy przestrzeń nazw SVG jest dobrze sformułowana? Pokazany fragment nie zawiera powiązania z prefiksem "xlink". –

Odpowiedz

1

myślę, że wpadł na przyczyny tej operacji XSLT:

http://www.w3schools.com/xsl/el_namespace-alias.asp 

, który pozostawia nienaruszone przestrzenie nazw, dopóki nie zostanie wygenerowany wynik, kiedy zostanie wykonana transformacja przestrzeni nazw.