使用copy-of与document()将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

hrefimage元素值上缺少的xlink命名空间特别成问题。

关于如何在不做任何解释的情况下以不同方式读取SVG文件的任何想法?

我找到了一个“可行”的解决方案,但这是一个hack,我想要更优雅的东西:

<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
您的样式表是否在root标记中声明了所有名称空间?
PhillyNJ

6
SVG名称空间格式正确吗?您显示的片段不包含前缀“ xlink”的绑定。
2013年

3
您使用哪种XSLT 2.0处理器?您能否发布最少但完整的样本以使我们重现问题?您使用哪种XSLT输出方法?
Martin Honnen

15
乍一看,它看起来像是XSLT处理器中的错误。但是当您说要将其复制到HTML文档时,引起了我的怀疑。如果将其添加到HTML DOM,则HTML DOM不适合命名空间使用,因此可能会发生各种情况。但是,您的标题为“ xHTML”。因此,我认为我们需要了解更多:您正在使用哪种XSLT处理器,以及如何运行它?
迈克尔·凯,

1
您介意共享您的代码和实现吗?我很好奇至少要重现这一点。
杰拉德·范·海顿

Answers:


1

我认为您已经想到执行此XSLT操作的原因:

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

完成名称空间转换后,直到经过生成的输出之前,整齐的名称空间将保持不变。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.