尝试使用XSLT输出方法“ html”时,为什么我的SVG没有显示?

时间:2019-10-31 21:11:58

标签: xslt svg

很抱歉,这是一个简单的问题,因为我是XSLT的新手。我有一个问题,如果我的输出方法设置为html,则在XSLT中生成的SVG图像将不会显示。如果我打开所需的xml文件,对其进行转换,然后在浏览器(IE v11)中进行查看,则整个文档将加载,但SVG图像本身除外。在IE中,如果我右键单击该文档并选择“查看源代码”,则可以在其中看到SVG信息,就在该位置。

如果我将输出方法设置为xml并在IE中打开,则SVG图像确实出现了,但是文档结构不存在(但要重申:目标是在html中输出,因为它在其他过程中使用了)行)

下面是一个简短的小型测试XSLT的代码片段,以及从“查看源代码”中看到的转换后的xml(省略了无关的内容)。在解决大局之前,我正在尝试使其小规模工作。

还要注意,svg:text标记确实显示了所提到的文本,尽管它看起来更像是简单的文本输入,而不是图像的一部分。

对于熟悉它的人来说,大多数功能来自RenderX的XSLT条码生成器。

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
  xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg">

  <xsl:import href="code128.xsl"/>

  <xsl:output method='html' media-type="image/svg" encoding='UTF-8' indent='yes'/>

  <xsl:template match="/">
    <html lang="en">
      <head>
        <title>SVG bar code examples</title>
      </head>
      <body>
        <h1>SVG bar code examples</h1>
        <ul>
          <xsl:apply-templates select="//barcode"/>
        </ul>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="barcode">
    <li>
      <xsl:call-template name="barcode-code128">
      .
      <!--Parameters here-->
      .
      </xsl:call-template>
    </li>
  </xsl:template>
</xsl:stylesheet>

转换后的XML:

<?xml version="1.0" encoding="utf-8"?>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg">
  <head>
    <title>SVG bar code examples</title>
  </head>
  <body>
    <h1>SVG bar code examples</h1>
    <ul>
      <li>
        <svg:svg width="29.494444444444443mm" height="12.7mm" viewBox="0 0 10618 4572">
          <svg:path d="M 686 686 l 0 2286 138 0 0 -2286 z m ..."(truncated due to length)>
          <svg:text x="6068" y="4420" text-anchor="middle" font-family=...
        </svg:svg>
      </li>
      .
      <!--More SVG images here-->
      .
    </ul>
  </body>
</html>

1 个答案:

答案 0 :(得分:1)

如果要使用输出方法html,则应该使用HTML语法,并且HTML 4和HTML5或简称为HTML的东西现在都不支持名称空间,尤其是不带前缀的元素名称。因此,要使您的SVG元素在text / html中被识别,您只需将svgpathtext作为没有任何前缀的元素名称,唯一允许的“命名空间”声明应为{ xmlns="http://www.w3.org/2000/svg"元素上的{1}}。

我也不确定IE的SVG支持,也许仅在符合标准的渲染模式下启用,这意味着对于svg,建议使用method="html",因为<xsl:output method="html" indent="yes" version="5" doctype-system="about:legacy-doctype"/>应该将较早的浏览器设置为区分古怪模式和标准兼容模式到后者。

如果您使用的库创建了前缀元素,那么您将需要通过一个附加的转换步骤来运行它们,以剥离名称空间前缀,该名称空间在一次转换中只能在XSLT 1中使用专有扩展功能转换结果树片段成一个节点集:

doctype-system

请注意,对于将文本/ html和HTML 4或HTML5作为带有 <xsl:template match="barcode"> <li> <xsl:variable name="barcode-rtf"> <xsl:call-template name="barcode-code128"> . <!--Parameters here--> . </xsl:call-template> </xsl:variable> <xsl:apply-templates select="msxml:node-set($barcode-rtf)/node()" xmlns:msxml="urn:schemas-microsoft-com:xslt" mode="strip-svg-prefix"/> </li> </xsl:template> <xsl:template match="@* | node()" mode="strip-svg-prefix"> <xsl:copy> <xsl:apply-templates select="@* | node()" mode="strip-svg-prefix"/> </xsl:copy> </xsl:template> <xsl:template match="svg:*" mode="strip-svg-prefix" xmlns:svg="http://www.w3.org/2000/svg"> <xsl:element name="{local-name()}" namespace="http://www.w3.org/2000/svg"> <xsl:apply-templates select="@* | node()" mode="strip-svg-prefix"/> </xsl:copy> </xsl:template> 的转换目标,我建议对HTML元素完全不使用名称空间,即删除您拥有的XHTML名称空间声明。否则,空元素的序列化可能无法提供正确的HTML语法。