0

エッジとノードに onclick ハンドラーを追加して拡張したい SVG ファイルがあります。また、JavaScript を参照する script タグを追加したいと考えています。問題は、スクリプト タグに空の名前空間属性が追加されることです。私が理解しているこれに関する情報は見つかりませんでした。XSLT が空の名前空間を追加するのはなぜですか?

XSL ファイル:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
  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">

<xsl:output method="xml" encoding="utf-8" />

<xsl:template match="/svg:svg">
  <xsl:copy>
    <script type="text/ecmascript" xlink:href="base.js" /> <!-- this tag gets a namespace attr -->
    <xsl:apply-templates />
  </xsl:copy>
</xsl:template>

<!-- Identity transform http://www.w3.org/TR/xslt#copying -->
<xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

<!-- Check groups and add functions -->
<xsl:template match="svg:g">
  <xsl:copy>
    <xsl:if test="@class = 'node'">
      <xsl:attribute name="onclick">node_clicked()</xsl:attribute>
    </xsl:if>
    <xsl:if test="@class = 'edge'">
      <xsl:attribute name="onclick">edge_clicked()</xsl:attribute>
    </xsl:if>
    <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
4

1 に答える 1

2

接頭辞なしのリテラル結果要素scriptは、デフォルトの名前空間にあり、この場合は名前空間ではありません。結果ドキュメントでは、この要素は を介し​​て名前空間に明示的に配置されていませんxmlns=""

XML 1.0 の名前空間のセクション 6.2 には、次のように記載されています。

デフォルトの名前空間宣言の属性値は空である場合があります。これは、宣言の範囲内で、デフォルトの名前空間がない場合と同じ効果があります。

これをsvg:scriptデフォルトの名前空間にしたい場合は、svg 名前空間をスタイルシートのデフォルトにします。その名前空間にも名前空間プレフィックスが必要です。

<xsl:stylesheet version="1.0"
    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">
于 2010-03-29T14:43:49.883 に答える