使用document()和copy-of将SVG添加到XHTML输出

113

在处理我的 XML 时,我正在尝试使用以下行将从 href 属性引用的 SVG 文件直接复制到我的输出 HTML 中:

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

copy-namespaces应该不必要,因为默认值已经是"yes",但我还是加上了它,以防止关于我是否尝试过它的问题。

文件将被复制到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 文件?

我找到了一种“可行”的解决方案,但这只是个权宜之计,我想要更加优雅的方法:

<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
6
SVG命名空间格式正确吗?您显示的片段中没有包含'xlink'前缀的绑定。 - C. M. Sperberg-McQueen
3
您使用哪个XSLT 2.0处理器?您能否发布最简但完整的示例,以便我们重现该问题?您使用哪种XSLT输出方法? - Martin Honnen
15
乍一看,这似乎是你的XSLT处理器出现了错误。但当你说你要将它复制到一个HTML文档中时,我的怀疑被激起了。如果你正在将它添加到HTML DOM中,那么HTML DOM并不支持命名空间,所以可能会发生各种问题。然而,你的标题说“xHTML”。所以我想我们需要知道更多信息:你正在使用哪个XSLT处理器,并且你如何运行它? - Michael Kay
1
这是我列表中始终未回答的首要问题... 因此,我创建了一个示例,并且它在这里可以正常工作 - msxsl没有问题。这引出了@MartinHonnen的问题:您使用哪个XSLT处理器? - Wolfgang Kluge
显示剩余5条评论
1个回答

1

我认为你已经找到了这个XSLT操作的原因:

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

这将保留您损坏的命名空间,直到生成输出时才进行命名空间转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接