Hitachi

Cosminexus V11 アプリケーションサーバ Cosminexus XML Processor ユーザーズガイド


6.8.3 XSLT要素の注意事項

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

項番

注意事項

1

xsl:apply-imports要素が処理されません。

2

テンプレートがxsl:with-paramによってパラメタとしてノード集合を受け取った場合,そのパラメタをxsl:apply-templates要素のselect属性で参照すると,それ以降,同じパラメタを参照してもノード集合を取得できなくなります。

3

xsl:attribute要素の子要素がxsl:copyの場合,出力される属性値が空になります。

4

xsl:attribute要素の内容にxsl:value-of要素を指定する場合は,select属性に指定するXPath式を絶対ロケーションパスで記述してください。

5

xsl:attribute-set要素がuse-attribute-sets属性で自分自身を参照(循環参照)する場合,XSLTCではスタックオーバーフローが発生します。

6

すべての属性の属性値が等しいxsl:decimal-format要素を複数個定義した場合,XSLTCはエラーを通知します。

7

xsl: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>

9

xsl: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>

10

xsl: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()"に置き換えてください。

11

xsl: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>

12

xsl:import要素のhref属性の値が空文字列または空白だけの場合,errorイベントが発生し,エラーメッセージとして"null"が出力されます。

13

xsl:number要素のcount属性に"node()"を含むパターンを指定しないでください。要素ノードを番号付けする目的で"node()"を使用する場合は,代わりに"*"または"要素名"を使用してください。

14

xsl:number要素またはxsl:decimal-format要素のgrouping-separator属性に複数の空白文字列や1文字以上の文字列,または全角文字を指定した場合,エラーにはならず,指定した文字列で区切られた値が出力されます。

15

xsl:number要素のcount属性に"/"を指定した場合,XSLTでは"1"が出力されますが,XSLTCではjava.lang.VerifyErrorが発生します。

16

xsl:number要素のfrom属性に"/"を指定した場合,XSLTでは"1"が出力されますが,XSLTCではjava.lang.VerifyErrorが発生します。

17

xsl:output要素のdoctype-public属性には空文字列以外の文字列を指定してください。同様に,TransformerクラスのsetOutputPropertyメソッドを用いてdoctype-publicプロパティを設定する場合も,空文字列以外の文字列を指定してください。

18

xsl:processing-instruction要素のname属性に,処理命令のターゲット名として許されない"XML"を指定した場合,"<?XML?>"という不正な処理命令が出力されます。

19

xsl:sortのdata-type属性に不正な値"NUMBER"(大文字)を指定した場合,デフォルト動作("text"が指定された場合と同じ順序でソートする)が行われません。

20

xsl:sortのorder属性に不正な値"DESCENDING"(大文字)を指定した場合,デフォルト動作("ascending"が指定された場合と同じ順序でソートする)が行われません。

21

xsl: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>

22

xsl:template要素の子要素としてトップレベル要素を書いた場合,無視されずに有効な子要素として処理されます。

23

xsl:value-of要素のselect属性に,負のゼロを引数とするstring関数を記述した場合,XSLTでは"0"が出力されますが,XSLTCでは"-0"が出力されます。

24

xsl: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要素が現れた場合など),エラーにはならないで,不正な子要素が無視されます。