XHTML çıktısına SVG'ler eklemek için belgeyle () kopyasını kullanma


113

XML'imi işlerken, bir hreföznitelikten referans verilen bir SVG dosyasını aşağıdaki satırla doğrudan çıktı HTML'ime kopyalamaya çalışıyorum :

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

copy-namespacesVarsayılan değer zaten "evet" olduğu için gerekli olmayabilir, ama ben bunu denedim olsun veya olmasın hakkında sorular önlemek için ekledik.

Dosyalar HTML'ye kopyalanır, ancak ad alanlı öğeler eklenir. Örneğin, kopyalanmadan önce şuna benzeyen bir dosya:

  <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

Daha sonra şuna benziyor:

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

hrefGörüntü öğesinin değerindeki eksik xlink ad alanı özellikle sorunludur.

SVG dosyasında yorum yapmadan okumak için bunu nasıl farklı şekilde yapabileceğime dair herhangi bir fikriniz var mı?

"Çalışan" bir çözüm buldum, ancak bu bir hack ve daha zarif bir şey istiyorum:

<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
Stil sayfanız kök etiketinde belirtilen tüm ad alanlarına sahip mi?
PhillyNJ

6
SVG ad alanı iyi biçimlendirilmiş mi? Gösterdiğiniz parça, 'xlink' öneki için bir bağlanma içermiyor.
CM Sperberg-McQueen

3
Hangi XSLT 2.0 işlemcisini kullanıyorsunuz? Sorunu yeniden oluşturmamıza izin veren minimal ama eksiksiz örnekler gönderebilir misiniz? Hangi XSLT çıktı yöntemini kullanıyorsunuz?
Martin Honnen

15
İlk bakışta XSLT işlemcinizde bir hata gibi görünüyor. Ama onu bir HTML belgesine kopyaladığınızı söylediğinizde şüphelerim uyanıyor. Bunu bir HTML DOM'a ekliyorsanız, HTML DOM ad alanı dostu değildir, bu nedenle her tür şey olabilir. Ancak başlığınızda "xHTML" yazıyor. Bu yüzden, daha fazlasını bilmemiz gerektiğini düşünüyorum: hangi XSLT işlemcisini kullanıyorsunuz ve onu nasıl çalıştırıyorsunuz?
Michael Kay

1
Kodunuzu ve uygulamanızı paylaşır mısınız? En azından bunu yeniden üretmeyi merak ediyorum.
Gerard van Helden

Yanıtlar:


1

Sanırım bu XSLT işleminin nedenini buldunuz:

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

Bu, ad alanı dönüşümü tamamlandığında çıktı oluşturulana kadar karıştırılmış ad alanlarınızı olduğu gibi bırakır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.