Utilizzo di copy-of con document () per aggiungere SVG all'output XHTML


113

Durante l'elaborazione del mio XML, sto cercando di copiare un file SVG a cui fa riferimento un hrefattributo direttamente nel mio HTML di output con la seguente riga:

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

Non copy-namespacesdovrebbe essere necessario poiché il valore predefinito è "sì" comunque, ma l'ho aggiunto per evitare domande sul fatto che lo abbia provato o meno.

I file vengono copiati nell'HTML, ma tutti gli elementi con spazio dei nomi vengono nascosti. Ad esempio, un file simile 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

In seguito appare così:

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

Lo spazio dei nomi xlink mancante sul hrefvalore dell'elemento immagine è particolarmente problematico.

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

Ho trovato una soluzione che "funziona", ma è un trucco 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 tuo foglio di stile ha tutti gli spazi dei nomi dichiarati nel tag root?
PhillyNJ

6
Lo spazio dei nomi SVG è ben formato? Il frammento mostrato non include un'associazione per il prefisso "xlink".
CM Sperberg-McQueen

3
Quale processore XSLT 2.0 usi? Potete postare campioni minimi ma completi che ci permettano di riprodurre il problema? Quale metodo di output XSLT usi?
Martin Honnen

15
A prima vista sembra un bug nel tuo processore XSLT. Ma i miei sospetti vengono destati quando dici che lo stai copiando in un documento HTML. Se lo stai aggiungendo a un DOM HTML, l'HTML DOM non è compatibile con lo spazio dei nomi, quindi potrebbero accadere di tutto. Tuttavia, il tuo titolo dice "xHTML". Quindi penso che abbiamo bisogno di saperne di più: quale processore XSLT stai usando e come lo stai eseguendo?
Michael Kay

1
Ti dispiacerebbe condividere il codice e l'implementazione? Sono curioso di riprodurre almeno questo.
Gerard van Helden

Risposte:


1

Penso che tu abbia scoperto il motivo di questa operazione XSLT:

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

che lascia intatti i tuoi spazi dei nomi alterati fino a quando non viene generato l'output, quando la trasformazione dello spazio dei nomi è terminata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.