Podczas przetwarzania mojego kodu XML próbuję skopiować plik SVG, do którego odwołuje się href
atrybut, bezpośrednio do mojego wyjściowego kodu HTML za pomocą następującego wiersza:
<xsl:copy-of copy-namespaces="yes" select="document(@href)"/>
Nie copy-namespaces
powinno być konieczne, ponieważ wartość domyślna i tak to „tak”, ale dodałem ją, aby uniknąć pytań o to, czy próbowałem.
Pliki są kopiowane do kodu HTML, ale wszystkie elementy w przestrzeni nazw są otoczone. Na przykład plik, który wygląda tak 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 później tak:
<_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
Brak przestrzeni nazw xlink w href
wartości elementu obrazu jest szczególnie problematyczny.
Jakieś przemyślenia na temat tego, jak mogę to zrobić inaczej, aby przeczytać plik SVG bez żadnej interpretacji?
Znalazłem jedno rozwiązanie, które "działa", ale to hack i chciałbym coś bardziej eleganckiego:
<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>
Odpowiedzi:
Myślę, że trafiłeś na powód tej operacji XSLT:
co pozostawia zniekształcone przestrzenie nazw nienaruszone do momentu wygenerowania danych wyjściowych, po zakończeniu transformacji przestrzeni nazw.
źródło