document()でcopy-ofを使用してSVGをXHTML出力に追加する


113

XMLの処理中にhref、次の行を使用して、属性から参照されているSVGファイルを出力HTMLに直接コピーしようとしています。

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

copy-namespacesデフォルト値はとにかく「はい」であるので、必要はありませんが、私はそれを試してみたかどうかについての質問を防止することを追加しました。

ファイルはHTMLにコピーされますが、名前空間要素はすべてホースされます。たとえば、コピーされる前は次のようなファイルです。

  <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

その後は次のようになります。

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

href画像要素の値に欠落しているxlink名前空間は特に問題です。

解釈なしでSVGファイルを読み取るためにこれをどのように異なる方法で実行できるかについての考えはありますか?

「機能する」ソリューションが1つ見つかりましたが、これはハックであり、よりエレガントなものを希望します。

<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
あなたのスタイルシートには、ルートタグで宣言されているすべての名前空間がありますか?
PhillyNJ 2013

6
SVG名前空間は整形式ですか?表示するフラグメントには、プレフィックス「xlink」のバインディングが含まれていません。
CM Sperberg-McQueen 2013

3
どのXSLT 2.0プロセッサを使用していますか?問題を再現できる最小限の完全なサンプルを投稿できますか?どのXSLT出力方法を使用しますか?
Martin Honnen 2013

15
一見すると、XSLTプロセッサのバグのように見えます。しかし、あなたがそれをHTML文書にコピーしていると言ったとき、私の疑惑は高まります。HTML DOMに追加する場合、HTML DOMは名前空間に適さないため、あらゆる種類のことが発生する可能性があります。ただし、タイトルに「xHTML」と表示されています。ですから、もっと知る必要があると思います。どのXSLTプロセッサを使用しており、どのように実行していますか?
Michael Kay

1
コードと実装を共有していただけませんか?少なくともこれを再現することに興味があります。
Gerard van Helden、2015年

回答:


1

このXSLT操作の理由はわかったと思います。

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

これにより、名前空間の変換が行われて出力が生成されるまで、破損した名前空間がそのまま残ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.