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:要素>

(xmlspy) で xmlns 属性を割り当てられないため、これは失敗します。

ルート (svg) で名前空間を指定しない場合、xmlns はルートの <svg> ノードに自動的に追加され、すべての第 1 レベルのサブノードに次のような名前空間参照が適用されます (<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 レベルのサブブランチで余分な名前空間を参照せずに高さと幅の値を計算するにはどうすればよいですか?

4

1 に答える 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"/> 
于 2013-02-18T23:26:55.307 に答える