当前位置: 首页 > 知识库问答 >
问题:

XSLT生成的具有正确名称空间的SVG

梁丘琛
2023-03-14

抱歉,如果我问的是新手问题,但名称空间对我来说真的很费解。

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

共有1个答案

刘海
2023-03-14

查找属性值模板,并阅读有关它们的内容。使用它们来计算高度和宽度的值,而不是使用硬编码的值。因此当前的文字结果元素变成如下内容:

<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"/> 
 类似资料:
  • 我需要一个简单的xslt,它接受输入并提供如下所述的输出。我已经编写了xslt,但名称空间被忽略了。你能帮我一下吗。 输入消息: 预期输出消息: 实际输出消息: XSLT:

  • 问题内容: 想知道是否有人在使用新功能通过PHP 5.3对类进行命名空间时是否遇到了此问题。 我正在使用单独的类来生成动态类调用,以在应用程序中定义用户类型。基本上,类定义器采用类型的整数表示形式并解释它们,返回一个包含要用作该用户模型的类名的字符串。 我在全局范围内定义了具有该名称的用户类型的对象模型,但是在Editor名称空间中,该用户的编辑器具有另一个名称相同的对象。由于某些原因,PHP不允

  • 问题内容: 我想获取标记之间的所有内容,但是由于urn:名称空间,我不知道该怎么做。 有任何想法吗? 问题答案: 简短的答案:使用XPath 。这样:将返回 或者,您可以实现一个映射名称空间名称和URI的,并在查询之前在XPath对象上对其进行设置。 看一下这篇博客文章, 更新: 该文章已结束,您可以在webarchive上看到它 解决方案1样本: 解决方案2样本: 编辑 这是一个完整的示例,它可

  • 我已经阅读了man页面,但我不明白name和namespace是用来做什么的。 对于版本3和版本5的UUID,必须给出额外的命令行参数命名空间和名称。命名空间要么是字符串表示中的UUID,要么是内部预定义命名空间UUID的标识符(目前已知的是“ns: DNS”、“ns: URL”、“ns: OID”和“ns: X500”)。名称是任意长度的字符串。 命名空间: 命名空间可以是字符串表示形式的UUI

  • 问题内容: Sun / Oracle JDK在java.util包中公开了一个用于创建类型3(基于名称)的UUID的函数:java.util.UUID.nameUUIDFromBytes(byte [] name)。 我需要能够使用nameUUIDFromBytes在Java中生成类型3 UUID,并在创建另一种语言的类型3 UUID时达到相同的UUID,假设我提供与源相同的字节。 根据javad

  • 我发送一个POST请求,从一家运输公司生成AWB。为了做到这一点,我必须通过SOAP API POST请求发布多个数据条目。下面的XML是类似的,这是必需的(我已经简化了,否则它要求超过30个参数) 我是SOAP新手,请帮助我朝着正确的方向前进,我甚至非常感谢上面的XML代码,因为它有助于更好地理解。