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>
Il foglio di stile ha tutti gli spazi dei nomi dichiarati nel tag radice? – PhillyNJ
Sì, è stato anche il mio primo pensiero. – jrhooker
Lo spazio dei nomi SVG è ben formato? Il frammento che mostri non include un binding per il prefisso 'xlink'. –