Menggunakan copy-of dengan document () untuk menambahkan SVG ke keluaran XHTML

113

Saat memproses XML saya, saya mencoba menyalin file SVG yang direferensikan dari hrefatribut langsung ke HTML keluaran saya dengan baris berikut:

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

The copy-namespacesseharusnya tidak diperlukan karena nilai default adalah "ya" saja, tapi aku sudah menambahkan untuk mencegah pertanyaan tentang apakah atau tidak saya sudah mencobanya.

File-file tersebut disalin ke dalam HTML, tetapi setiap elemen dengan namespace disemprot. Misalnya, file yang terlihat seperti ini sebelum disalin:

  <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

Tampak seperti ini setelahnya:

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

Namespace xlink yang hilang pada hrefnilai elemen gambar sangat bermasalah.

Adakah pemikiran tentang bagaimana saya dapat melakukan ini secara berbeda untuk membaca di file SVG tanpa interpretasi apa pun?

Saya telah menemukan satu solusi yang "berhasil", tetapi ini adalah retasan dan saya ingin solusi yang lebih elegan:

<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
sumber
5
Apakah stylesheet Anda memiliki semua ruang nama yang dideklarasikan di tag root?
PhillyNJ
6
Apakah namespace SVG dibentuk dengan baik? Fragmen yang Anda tampilkan tidak menyertakan pengikatan untuk awalan 'xlink'.
CM Sperberg-McQueen
3
Prosesor XSLT 2.0 mana yang Anda gunakan? Dapatkah Anda memposting sampel minimal tetapi lengkap yang memungkinkan kami mereproduksi masalahnya? Metode keluaran XSLT mana yang Anda gunakan?
Martin Honnen
15
Sekilas terlihat seperti bug di prosesor XSLT Anda. Tapi kecurigaan saya muncul ketika Anda mengatakan Anda menyalinnya ke dokumen HTML. Jika Anda menambahkannya ke HTML DOM, maka HTML DOM tidak ramah namespace, jadi segala macam hal mungkin terjadi. Namun, judul Anda mengatakan "xHTML". Jadi saya pikir kita perlu tahu lebih banyak: prosesor XSLT apa yang Anda gunakan, dan bagaimana Anda menjalankannya?
Michael Kay
1
Maukah Anda membagikan kode dan penerapan Anda? Saya penasaran untuk setidaknya mereproduksi ini.
Gerard van Helden

Jawaban:

1

Saya pikir Anda telah menemukan alasan operasi XSLT ini:

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

yang membiarkan namespace Anda yang rusak tetap utuh hingga keluaran dihasilkan, saat transformasi namespace selesai.

Orang Perangkat Lunak Tertua
sumber