Usando copy-of com document () para adicionar SVGs à saída XHTML

113

Enquanto processo meu XML, estou tentando copiar um arquivo SVG referenciado de um hrefatributo diretamente em meu HTML de saída com a seguinte linha:

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

O copy-namespacesnão deve ser necessário, pois o valor padrão é "sim" de qualquer maneira, mas eu o adicionei para evitar dúvidas sobre se tentei ou não.

Os arquivos são copiados para o HTML, mas todos os elementos com namespace são hospedados. Por exemplo, um arquivo parecido com este antes de ser copiado:

  <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

Depois fica assim:

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

O namespace xlink ausente no hrefvalor do elemento de imagem é particularmente problemático.

Alguma ideia de como posso fazer isso de maneira diferente para ler o arquivo SVG sem qualquer interpretação?

Encontrei uma solução que "funciona", mas é um hack e gostaria de algo mais 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>
jrhooker
fonte
5
Sua folha de estilo tem todos os namespaces declarados na tag raiz?
PhillyNJ
6
O namespace SVG está bem formado? O fragmento que você mostra não inclui uma ligação para o prefixo 'xlink'.
CM Sperberg-McQueen
3
Qual processador XSLT 2.0 você usa? Você pode postar amostras mínimas, mas completas, que nos permitam reproduzir o problema? Qual método de saída XSLT você usa?
Martin Honnen
15
À primeira vista, parece um bug em seu processador XSLT. Mas minhas suspeitas aumentam quando você diz que o está copiando para um documento HTML. Se você o estiver adicionando a um HTML DOM, então o HTML DOM não é compatível com namespace, portanto, todos os tipos de coisas podem acontecer. No entanto, seu título diz "xHTML". Portanto, acho que precisamos saber mais: qual processador XSLT você está usando e como o está executando?
Michael Kay
1
Você se importaria de compartilhar seu código e implementação? Estou curioso para pelo menos reproduzir isso.
Gerard van Helden

Respostas:

1

Acho que você descobriu o motivo desta operação XSLT:

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

o que deixa seus namespaces mutilados intactos até que a saída seja gerada, quando a transformação do namespace é concluída.

Cara do software mais antigo
fonte