很抱歉,这是一个简单的问题,因为我是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>
答案 0 :(得分:1)
如果要使用输出方法html
,则应该使用HTML语法,并且HTML 4和HTML5或简称为HTML的东西现在都不支持名称空间,尤其是不带前缀的元素名称。因此,要使您的SVG元素在text / html中被识别,您只需将svg
,path
和text
作为没有任何前缀的元素名称,唯一允许的“命名空间”声明应为{ 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语法。