【问题标题】:XSLT generated SVG with right namespaceXSLT 生成具有正确命名空间的 SVG
【发布时间】:2013-02-03 11:25:52
【问题描述】:

对不起,如果我问的是新手问题,但命名空间对我来说真的很令人费解。

我正在尝试从单个 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...

但我希望能够根据计算的内容指定高度和宽度属性

我尝试将“”创建为 http://www.w3.org/2000/svg

这失败了,因为它 (xmlspy) 不允许我分配 xmlns 属性。

如果我没有在根 (svg) 上指定命名空间,xmlns 会自动添加到根 节点,并且所有第一级子节点都应用如下命名空间引用(参见

<?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 元素上指定所需的命名空间,同时计算高度和宽度的值,而无需对一级子分支进行多余的命名空间引用?

【问题讨论】:

  • 我无法理解您的问题。为什么计算高度和宽度和高度会导致这里出现问题?您的示例代码都没有显示任何关于这个非常重要的点。

标签: xml xslt svg xml-namespaces


【解决方案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"/> 

【讨论】:

  • n.b.如果名称和命名空间已知,则无需使用 xsl:element。用&lt;svg xmlns="http://www.w3.org/2000/svg"&gt; 替换xsl:element 在这里就可以了。
  • 而使用 xsl:element 的结果是,其他三个命名空间被添加到所有一级子节点。所以我同意第一个建议。非常感谢 C.M.
猜你喜欢
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多