2013-08-30 18 views
113

Mentre esamina la mia XML, sto cercando di copiare un file in formato SVG fa riferimento da un attributo href direttamente nel mio output HTML con la seguente riga:Utilizzando copia-di con documenti() per aggiungere SVG per l'output XHTML

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

Il copy-namespaces non dovrebbe essere necessario poiché il valore predefinito è "sì" in ogni caso, ma l'ho aggiunto per evitare domande sull'opportunità o meno di averlo provato.

I file vengono copiati nell'HTML, ma tutti gli elementi con nomi assegnati vengono hosed. Ad esempio, un file che assomiglia a questo, prima di essere copiato:

<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 

appare come questa in seguito:

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

Il namespace XLink mancante sul valore href dell'elemento immagine è particolarmente problematico.

Qualche idea su come posso farlo in modo diverso da leggere nel file SVG senza alcuna interpretazione?

ho trovato una soluzione che "funziona", ma si tratta di un hack e vorrei qualcosa di più elegante:

<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

Il foglio di stile ha tutti gli spazi dei nomi dichiarati nel tag radice? – PhillyNJ

+0

Sì, è stato anche il mio primo pensiero. – jrhooker

+6

Lo spazio dei nomi SVG è ben formato? Il frammento che mostri non include un binding per il prefisso 'xlink'. –

risposta

1

Credo che hai colpito sulla ragione di questa operazione XSLT:

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

che lascia intatti gli spazi dei nomi bloccati finché non viene generato l'output, quando viene eseguita la trasformazione dello spazio dei nomi.