2013-02-18 40 views
0

對不起,如果我問一個新手問題,但命名空間真的讓我感到困惑。XSLT使用右命名空間生成的SVG

我想從單個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>」as < xsl:element name =「svg」> <的xsl:屬性名稱= 「的xmlns」 > http://www.w3.org/2000/svg </XSL:屬性> </XSL:元素>

,因爲它(的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元件上,並且在同一時間計算的高度和寬度的值,而不在第一級子分支多餘命名空間引用指定需要的命名空間?

+0

我無法理解你的問題。爲什麼要計算造成問題的高度和寬度以及高度?您的示例代碼中沒有一個顯示關於該非常重要的一點。 – JLRishe 2013-02-18 22:29:55

回答

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"/> 
+0

n.b.如果名稱和名稱空間已知,則不需要使用'xsl:element'。用'替換'xsl:element''在這裏工作得很好。 – JLRishe 2013-02-18 23:50:23

+0

而使用xsl:元素的結果是,其他三個名稱空間被添加到所有第一級子節點。 因此,我會首先提出建議。非常感謝你C.M. – TheRoadrunner 2013-02-19 06:55:28