たなかこういちの資料室

システム開発に携わる筆者があれこれ試したことや学んだことについてのまとめ

XSLT内で、UUIDと連番を生成するTips

o 入力XMLのイメージ
 
-----(ここから)-----
<customers>
    <customer name="佐々木希"/>
    <customer name="石原さとみ"/>
    ・・・
<customers>
-----(ここまで)-----
 
o 変換後XMLのイメージ
 
-----(ここから)-----
<Customers>
    <Customer id="4c35fa41-2bdd-ab57-24dc-9b0ec1b12cf5"><!-- UUID -->
        <No>1</No><!-- 連番 -->
        <DispName>佐々木希</DispName>
    </Customer>
    <Customer id="35cc4cf5-4d3d-b5a1-1b12-24dc8b0fa41e"><!-- UUID -->
        <No>2</No><!-- 連番 -->
        <DispName>石原さとみ</DispName>
    </Customer>
    ・・・
<Customers>
-----(ここまで)-----
 
o UUIDを扱うためのXSLの要点
 
(1) 以下のような"uuid"ネームスペースの定義を追加
 
-----(ここから)-----
<xsl:stylesheet
    xmlns:uuid="xalan://java.util.UUID"
    version="2.0"
>
-----(ここまで)-----
 
注意
・Saxon実装を用いている場合はネームスペースは次のように定義する; ただし"HE"では機能しない
 
-----(ここから)-----
xmlns:uuid="java:java.util.UUID"
-----(ここまで)-----
 
・Antのxsltタスクで実施する場合、かつAnt導入先の"lib"サブディレクトリ(等)に"saxon9he.jar"などが置かれているとき、xsltタスクの<factory>子要素にデフォルトのXalanの実装を明示しないと、Saxonがロードされ、Xalan形式のネームスペース定義がエラーとなってしまう
 
-----(ここから)-----
<xslt style=...>
    <factory
        name="com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"/>
    <!--<factory name="net.sf.saxon.TransformerFactoryImpl"/>-->
</xslt>
-----(ここまで)-----
 
(2) 以下のようにUUID取得する
 
-----(ここから)-----
<xsl:variable name="uuid" select="uuid:randomUUID()"/>
-----(ここまで)-----
 
o 連番を扱うためのXSLの要点
 
・連番にはXPath関数の「position()」を用いることができる
 
-----(ここから)-----
<xsl:template match="customer">
    <xsl:variable name="no" select="position()"/>
-----(ここまで)-----
 
o 本記事の説明を実装したXSLのサンプル
 
 
※Ant build.xmlも
 
o 参考記事
 
 
◆以上