首页 文章

XSLT使用正确的命名空间生成SVG

提问于
浏览
0

对不起,如果我问一个新手问题,但命名空间对我来说真的很困惑 .

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

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

我试图创建"<svg>"为<xsl:element name = "svg"> <xsl:attribute name = "xmlns"> http://www.w3.org/2000/svg </ xsl:attribute> </ xsl:element>

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

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

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

1 回答

  • 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"/>
    

相关问题