6.8.3 XSLT要素の注意事項

表6-15 XSLTCに関する注意事項(XSLT要素)

項番注意事項
1xsl:apply-imports要素が処理されません。
2テンプレートがxsl:with-paramによってパラメタとしてノード集合を受け取った場合,そのパラメタをxsl:apply-templates要素のselect属性で参照すると,それ以降,同じパラメタを参照してもノード集合を取得できなくなります。
3xsl:attribute要素の子要素がxsl:copyの場合,出力される属性値が空になります。
4xsl:attribute要素の内容にxsl:value-of要素を指定する場合は,select属性に指定するXPath式を絶対ロケーションパスで記述してください。
5xsl:attribute-set要素がuse-attribute-sets属性で自分自身を参照(循環参照)する場合,XSLTCではスタックオーバーフローが発生します。
6すべての属性の属性値が等しいxsl:decimal-format要素を複数個定義した場合,XSLTCはエラーを通知します。
7xsl:element要素またはxsl:attribute要素のname属性には属性値テンプレートを指定しないでください。
8次の条件がすべて重なるとき,要素が属する名前空間が不正になります。
  • xsl:element要素の子要素にxsl:attribute要素がある。
  • xsl:element要素のname属性が接頭辞付きの名前で,namespace属性の指定がある。
  • xsl:attribute要素のname属性が接頭辞付きの名前で,namespace属性の指定がある。
  • xsl:elementとxsl:attributeのname属性に指定された接頭辞が同じで,namespace属性の値が異なる。
上記現象が発生するスタイルシートの例を次に示します。

<xsl:template match="/">
 <xsl:element name="child1" namespace="AAA">
     <xsl:element name="A:child2" namespace="XXX">
       <xsl:attribute name="A:attr" namespace="AAA">1</xsl:attribute>
     </xsl:element>
 </xsl:element>
</xsl:template>

9xsl:for-each要素のselect属性に述部を持つXPath式を指定する場合,述部に「ノードを比較対象とする式」を指定しないでください。この場合,スタイルシートを次のように変更してください。
  1. xsl:for-each要素のselect属性のXPath式から述部を削除してください。
  2. xsl:for-each要素の子にxsl:if要素を挿入して,test属性に1.で削除した述部の内容を指定してください。
スタイルシートの変更例を次に示します。
(変更前)

<xsl:template match="/">
 <xsl:for-each select="element[sub='x']">
   <xsl:value-of select="."/>
 </xsl:for-each>
</xsl:template>

(変更後)

<xsl:template match="/">
 <xsl:for-each select="element">
   <xsl:if test="sub='x'">
     <xsl:value-of select="."/>
   </xsl:if>
 </xsl:for-each>
</xsl:template>

10xsl:for-each要素のselect属性に「"descendant::node()"または"descendant-or-self::node()"を含むXPath式」を指定しないでください。要素ノードおよびテキストノードを選択する目的でこのようなXPath式を使用する場合は,スタイルシートを次のように変更してください。
  • "descendant::node()"を"descendant::node()|descendant::text()"に置き換えてください。
  • "descendant-or-self::node()" を"descendant-or-self::node()|descendant-or-self::text()"に置き換えてください。
11xsl:if要素またはxsl:when要素のtest属性に「self軸と述部を両方持つXPath式」を指定しないでください。この場合,スタイルシートを次のように変更してください。
  1. xsl:if要素またはxsl:when要素のtest属性のXPath式から,述部を削除してください。
  2. xsl:if要素またはxsl:when要素の子にxsl:if要素を挿入して,そのtest属性に1.で削除した述部の内容を指定してください。
スタイルシートの変更例を次に示します。
(変更前)

<xsl:template match="/element/sub">
 <xsl:if test="self::sub[attribute::attr='x']">
   <xsl:value-of select="."/>
 </xsl:if >
</xsl:template>

(変更後)

<xsl:template match="/element/sub">
 <xsl:if test="self::sub">
   <xsl:if test="attribute::attr='x'">
     <xsl:value-of select="."/>
   </xsl:if>
 </xsl:if >
</xsl:template>

12xsl:import要素のhref属性の値が空文字列または空白だけの場合,errorイベントが発生し,エラーメッセージとして"null"が出力されます。
13xsl:number要素のcount属性に"node()"を含むパターンを指定しないでください。要素ノードを番号付けする目的で"node()"を使用する場合は,代わりに"*"または"要素名"を使用してください。
14xsl:number要素またはxsl:decimal-format要素のgrouping-separator属性に複数の空白文字列や1文字以上の文字列,または全角文字を指定した場合,エラーにはならず,指定した文字列で区切られた値が出力されます。
15xsl:number要素のcount属性に"/"を指定した場合,XSLTでは"1"が出力されますが,XSLTCではjava.lang.VerifyErrorが発生します。
16xsl:number要素のfrom属性に"/"を指定した場合,XSLTでは"1"が出力されますが,XSLTCではjava.lang.VerifyErrorが発生します。
17xsl:output要素のdoctype-public属性には空文字列以外の文字列を指定してください。同様に,TransformerクラスのsetOutputPropertyメソッドを用いてdoctype-publicプロパティを設定する場合も,空文字列以外の文字列を指定してください。
18xsl:processing-instruction要素のname属性に,処理命令のターゲット名として許されない"XML"を指定した場合,"<?XML?>"という不正な処理命令が出力されます。
19xsl:sortのdata-type属性に不正な値"NUMBER"(大文字)を指定した場合,デフォルト動作("text"が指定された場合と同じ順序でソートする)が行われません。
20xsl:sortのorder属性に不正な値"DESCENDING"(大文字)を指定した場合,デフォルト動作("ascending"が指定された場合と同じ順序でソートする)が行われません。
21xsl:template要素のmatch属性に「"node()"を含み,かつ,その後ろにロケーションパスが続くXPath式」を指定しないでください。要素ノードを選択する目的で"node()"を使用する場合は,代わりに"*"を使用してください。スタイルシートの変更例を次に示します。
(変更前)

<xsl:template match="/node()/sub">
<result><xsl:value-of select="."/></result>
</xsl:template>

(変更後)

<xsl:template match="/*/sub">
<result><xsl:value-of select="."/></result>
</xsl:template>

22xsl:template要素の子要素としてトップレベル要素を書いた場合,無視されずに有効な子要素として処理されます。
23xsl:value-of要素のselect属性に,負のゼロを引数とするstring関数を記述した場合,XSLTでは"0"が出力されますが,XSLTCでは"-0"が出力されます。
24xsl:variable要素の子要素にxsl:call-template要素を指定し,かつ,xsl:call-templateで呼び出されたテンプレート内に名前空間接頭辞を持つリテラル要素がある場合,xsl:copy-of要素でその変数が示す要素をコピーすると,要素の名前空間宣言が正しくコピーされません。
25リテラル結果要素にxsl:extension-element-prefixes属性を指定して拡張要素とした場合,拡張要素の子要素として書かれたxsl:fallback要素が無視されます。代わりにxsl:stylesheet要素にextension-element-prefixes属性を指定してください。
26スタイルシート内で仕様上,許されない場所に子要素を書いた場合(例:xsl:stylesheet要素の子要素としてリテラル要素を書いた場合,xsl:namespace-alias要素の子要素としてxsl:text要素が現れた場合など),エラーにはならないで,不正な子要素が無視されます。