XSLT 2.0で便利になった機能(19) QName関係の関数

今回はQName関係の関数です.スタイルシートをお書きの皆さんでしたら、スタイルシートの先頭に、
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
と書いて、ネームスペースxslを宣言し、テンプレートでは
 
<xsl:template name="xxx">
 
というように書いていると思います.要素の名前「xsl:template」は「:」の前のprefix(名前空間接頭辞)と、後のlocal-name部分(ローカル名)から成ります.(Lexical QName)この場合は、prefixは「xsl」で、local-nameは「template」となります.prefixと「:」がない場合もあります.「xsl」の表すnamespace URIは"http://www.w3.org/1999/XSL/Transform"になります.
 
XSLT2.0でのツリーモデルでは、要素の名前はxs:QName型であるとされます.そして、xs:QNameは3つの部分のprefix、namespace URI、local partから構成されるものと考えます.
 
XSLT1.0では、xs:QNameのような型が存在しなかったので、XSLT2.0ではQName関係の関数が追加されています.
 
■ QName()
namespace URIと、lexical QNameを与えて、xs:QNameを返します.
例えば、
 
 
は、上記のxsl:templateのxs:QNameを返します.3つの構成要素の、prefixは"xsl"、namespace URIは"http://www.w3.org/1999/XSL/Transform"、local partは "template" となります.
 
■ node-name()、local-name-from-QName()、namespace-uri-from-QName()、prefx-from-QName()
node-name()はnode()?をパラメータとして与え、xs:QName?を返します.xs:QNameだけでは、printableではありません.例えば変数$aが例の<xsl:template>を指しているとします.すると、
 
local-name-from-QName(node-name($a)) は "template"を返します.
namespace-uri-from-QName(node-name($a)) は "http://www.w3.org/1999/XSL/Transform" を返します.
prefix-from-QName(node-name($a)) は "xsl" を返します.
 
でも、簡単にするのだったら既存のlocal-name()、namespace-uri()を使うでしょう.御存知のように、xs:QNameを介さなくても以下ができます.
 
local-name($a) は "template" を返します.
namespace-uri($a) は "http://www.w3.org/1999/XSL/Transform" を返します.
name($a) は "xsl:template" を返します.

■ resolve-QName()
xs:string?のlexical QNameと、element()の2つをパラメータにして、xs:QNameを返します.lexical QNameのnamespace URIの部分は、そのときelement()で使用されているnamespace nodeのnamespace URIとprefixの対応を考慮して変更されます.
 
例えば、上記の
resolve-QName('xsl:template',$a) は prefix-from-QName()が、"xsl:template"のxs:QNameを返します.
何かいまいちわからないかもしれませんが、要素には名前空間ノードが存在し、そこで有効なnamespace URIとprefixが管理されています.結果のQNameには、lexical QNameで指定したprefixに対応するnamespace URIがセットされます.この場合は"http://www.w3.org/1999/XSL/Transform"です.
 
QName関係の関数は、あまりなじみがないかもしれません.よほど名前空間が入り混じった場合とか、使用するnamespace URIがパラメータで与えられるとか、deepなスタイルシートを書く機会がない限りお世話になることは少ないのではないかと思われます.