很抱歉,如果我问一个新手问题,但命名空间对我来说真是令人费解。
我正在尝试从单个XML / XSLT生成许多SVG文档。
我的样式表:
<xsl:stylesheet version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
>
<xsl:output method="xml" indent="yes" name="xml" cdata-section-elements="style"/>
<xsl:template match="/">
<xsl:apply-templates select="//root/menu"/>
</xsl:template>
<xsl:template match="menu">
<xsl:variable name="filename" select="concat(@name,'.svg')"/>
<xsl:result-document href="{$filename}" format="xml">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" baseProfile="basic" id="svg-root" width="482" height="600">
<defs>
<style type="text/css"><![CDATA[rect {
fill: white;
fill-opacity:1;
continues...
这可以工作并产生以下输出:
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.1" baseProfile="basic" id="svg-root" width="482" height="600">
<defs>
<style type="text/css"><![CDATA[rect {
fill: white;
fill-opacity:1;
continues...
但我希望能够根据计算出的内容指定高度和宽度属性
我试图创建“&lt; svg&gt;” as&lt; xsl:element name =“svg”&gt;&lt; xsl:attribute name =“xmlns”&gt; http://www.w3.org/2000/svg&lt; / xsl:attribute&gt;&lt; / xsl:element&gt;
这失败了,因为它(xmlspy)不允许我分配xmlns属性。
如果我没有在根(svg)上指定命名空间,则会自动将xmlns添加到根&lt; svg&gt;节点和所有第一级子节点应用命名空间引用,如下所示(请参阅&lt; defs&gt;)
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" baseProfile="basic" id="svg-root" width="482" height="600">
<defs xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<style type="text/css"><![CDATA[rect {
fill: white;
fill-opacity:1;
continues...
如何在根svg元素上指定所需的命名空间,同时计算高度和宽度的值,而不需要在第一级子分支上使用多余的命名空间引用?
答案 0 :(得分:1)
查找属性值模板,并阅读它们。使用它们来计算高度和宽度的值,而不是使用硬编码值。因此,您当前的文字结果元素将变为:
<xsl:variable name="width"
select="$raw-width * $compression-factor
+ $fudge"/>
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
baseProfile="basic"
id="svg-root"
width="{$width}"
height="{$width * 1.61803}">
如果您愿意,也可以使用元素和属性构造函数;你尝试这样做是因为你试图使用xsl:attribute构造函数创建一个名称空间声明,但是属性构造函数只能创建一个通用属性,而不能创建一个名称空间属性。你会想要这样的东西:
<xsl:variable name="width"
select="$raw-width * $compression-factor
+ $fudge"/>
<xsl:element name="svg"
namespace="http://www.w3.org/2000/svg">
<xsl:attribute name="version"
select="'1.1'"/>
<xsl:attribute name="baseProfile"
select="'basic'"/>
<xsl:attribute name="id"
select="'svg-root'"/>
<xsl:attribute name="width"
select="$width"/>
<xsl:attribute name="height"
select="$width * 1.61803"/>