質問
XSLT構造変換処理にて、「特定のノード以外」で空のノードは削除したXMLを作成する処理を検討しています。XSLTの条件指定箇所は以下の構文としており、他の一般的な変換テストツールだと特定のノードは残りますが、処理をすると消えてしまいます。
どのような記述をすれば意図したとおりに動作しますか。
<xsl:template match="*[(not(node()) or normalize-space(.)='') and not(self::aiueo) and not(self::kakikukeko)]"/>
回答
XSLT 構造変換処理の「XSLT」が以下の条件を満たした場合にXSLTが適切に動作しない障害を確認しております。
- 最初の述語が or を含む条件である
- 2 番目の述語が not() 関数を使用している場合
ご質問の XSLT を確認すると2つの述語に分解でき、前述の条件に該当していることが確認できます。
1つめ: [not(node()) or normalize-space(.)='']
2つめ: [not(self::aiueo or self::kakikukeko)]
回避策として、上記条件に合致しない記述とすることで、事象が回避可能です。
この動作は JDK の不具合として報告されておりました。
https://bugs.openjdk.org/browse/JDK-8372706
以下のXSLT を利用することで前述の条件(2つめ)に該当しないため、事象が回避可能です。
<xsl:template match="*[(not(node()) or normalize-space(.)='') and not(self::aiueo) and not(self::kakikukeko)]"/>
コメント
0件のコメント
記事コメントは受け付けていません。