IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  XML  >

XSLT 2.0 を利用してスキーマに対応した処理を行う

XSLT スタイルシートをスキーマ対応として設計するメリットを享受する

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

原文はこちら

原文はこちら


レベル: 中級

Mukul Gandhi, Senior System Analyst, IBM

2008年 04月 29日
更新 2008年 05月 15日

バージョン 2.0 がリリースされた XSLT を利用すると、スキーマに対応したスタイルシートを設計することができます。スキーマに対応した XSLT システムには多くの利点があります。例えば入力ツリーの検証を XLST 変換の前に行えるため XSLT スタイルシートは妥当な入力のみを処理することができます。あるいは、出力ツリーの検証を行えるため XSLT 変換は妥当な XML を出力するようになります。また変数、ユーザー定義の関数やテンプレートの入力パラメーター、関数の戻り値などに対して、データ型を指定することもできます。この記事では、スキーマ対応の機能の概念について学び、その利点を示す例をいくつか説明します。

XSLT 2.0 言語に関する W3C の仕様が公開されたことにより、最も重要な革新の 1 つが XSLT 言語にもたらされました。つまり、入力文書と出力文書、型を指定できる一時ツリーや一時構成体 (例えば関数やテンプレートのパラメーターなど)、そして変数に対しても XSLT プロセッサーが XML スキーマを利用できるようになったのです。

頻繁に使用する頭字語
  • W3C: World Wide Web Consortium
  • XML: Extensible Markup Language
  • XSLT: Extensible Stylesheet Language Transformations

XSLT プロセッサーがスキーマ対応の機能を実装するかどうかはオプションです。スキーマ対応の機能を実装していない XSLT プロセッサーは基本 XSLT プロセッサー (basic XSLT processor) と呼ばれ、スキーマ対応のこの機能を実装した XSLT プロセッサーはスキーマ対応 XSLT プロセッサー (schema-aware XSLT processor) と呼ばれます。

この記事では読者に XML と W3C の XML Schema 言語の知識があることを前提とし、またできれば XSLT の知識が多少あることが望ましいものとします。XSLT スタイルシートでスキーマ対応機能を効果的に活用するためには XML Schema の構文とセマンティクスを詳細に理解している必要があります。この記事の例を試すためには XSLT 2.0 言語のスキーマ対応機能を実装した XSLT 2.0 プロセッサーが必要です。この記事では、商用製品である Saxon-SA の評価版を使いました。この製品の 30 日間無料の評価ライセンスをダウンロードすることで、この機能を試すことができます。詳細は「参考文献」を参照してください。

XML Schema の概要

XML 文書は、スキーマに対応した設計にすることも、スキーマとは無関係の単独の XML 文書とすることもできます。単独の XML 文書は (テキストが入った) ネストされたタグを含んでいるだけであり、XML に関する整形式制約のみに従います。一方 XML スキーマに対応した設計の XML 文書は、そのスキーマの制約に従います。XML を扱う最近のほぼすべてのアプリケーションには、明確に定義された XML スキーマが含まれています。XML スキーマは XML 文書の構造を指定し、さらに要素と属性のデータ型を定義することもできます。

W3C の XML Schema 言語は、それまでの XML 妥当性検証言語である DTD (Document Type Definition) よりも、はるかに機能が強化されています。XML スキーマ (具体的には、非常に高度なデータ型の指定が可能な機能) とは異なり、DTD は複雑な XML 妥当性制約を表現することができませんでした。XML Schema 言語の詳細はこの記事では説明しませんが、この言語を学ぶための資料を「参考文献」に挙げてあります。

なぜスキーマ対応のスタイルシートを作成するのか

スキーマは通常、よく知られた XML 語彙や他の大規模なアプリケーションで利用されるものです。しかし皆さんはスタイルシートの作成者として、スキーマと型を自分自身で維持管理することができます。そうすることで、アプリケーションのアーキテクチャーにとっても、またアプリケーションによって解決しようとするビジネス上の問題にとっても、数えきれないほどのメリットがもたらされます。

スキーマ対応の XSLT 環境では、次の 3 つの場合に XML スキーマを使うことができます。

  • 入力 XML 文書の妥当性を検証する: この方法では、XML スキーマを使って入力 XML 文書の妥当性検証を行う際、XSLT スキーマ・サブシステムは入力文書のノードに型注釈を追加します。これにより、XSLT スタイルシートの中のノードに対して、型に対応した操作を行えるようになります。また入力の妥当性検証によって、XSLT スタイルシートが無効な入力を処理しないようにすることができます。
  • 出力 XML 文書の妥当性を検証する: アプリケーション全体のアーキテクチャーの観点からすると、これができることがスキーマ対応の XSLT スタイルシートを設計することによる最大のメリットです。この方法では、XML ストリームに対する制御を次のプロセスに渡す前に XLST 変換出力の妥当性検証を行うことで、多くのエラーを早い段階で検出することができ、後の処理チェーンの段階でのエラーを回避することができます。
  • 要素と属性、そして型の情報をスキーマから XSLT スタイルシートの中にインポートする: スタイルシートの中でスキーマ・コンポーネントを利用することによって、高度な型チェックを行うことができます。例えば変数のデータ型を、組み込みの、あるいはユーザー定義のスキーマ型として定義することができます。同様に、XSLT 関数の入力パラメーターと出力パラメーターの型や XSLT テンプレートのパラメーターの型を定義することができます。

XML スキーマは、スタイルシートのコンパイル中あるいは実行時間中 (つまり入力 XML 文書が変換される際) に使用することができます。XSLT 2.0 の仕様ではコンパイル時のスキーマの使用について何も触れていませんが、コンピューター言語の理論から、コンパイル時に追加の型情報があると、コンパイラーはコンパイル時に (例えば効率的なコードを生成するために) 最適化を行うことがよく知られています。また XLST スタイルシートの中にインラインでスキーマを作成できることも注目に値します (この例については、後ほど説明します)。これは簡単なアプリケーションの場合や、変換中に一時ツリーを検証する際に便利です。

ここから先では、今述べたような、スタイルシートの中でのスキーマの 3 通りの使い方の例を説明します。

入力 XML 文書の妥当性を検証する

最初の例では、XSLT スタイルシートの中でどのようにして入力文書の妥当性検証が利用されるのかを説明します。リスト 1 は注文書を表す XML 文書 (名前は po.xml) を示しています。


リスト 1. po.xml
                
      <?xml version="1.0" encoding="UTF-8"?>
      <PurchaseOrder orderid="10010"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xsi:noNamespaceSchemaLocation="po1.xsd">
       <orderFrom>XYZ Ltd.</orderFrom>
       <shipAddress>
         <name>XYZ Ltd.</name>
         <address>123, Wisconsin Street</address>
         <city>London</city>
         <country>United Kingdom</country>
       </shipAddress>
       <billAddress>
         <name>XYZ Ltd.</name>
         <address>123, Wisconsin Street</address>
         <city>London</city>
         <country>United Kingdom</country>
       </billAddress>
       <item id="100" type="book">
         <title>Water for Elephants</title>
         <note>Author(s): Sara Gruen</note>
         <quantity>1</quantity>
         <price>18.34</price>
       </item>
       <item id="101" type="book">
         <title>Glass Castle: A Memoir</title>
         <note>Author(s): Jeannette Walls and Julia Gibson</note>
         <quantity>1</quantity>
         <price>23.09</price>
       </item>
       <item id="200">
         <title>5 Amp Electric plug</title>
         <quantity>5</quantity>
         <price>10.10</price>
       </item>
      </PurchaseOrder>
      

リスト 2 はこの文書に対する XML スキーマ (名前は po1.xsd) を示しています。


リスト 2. po1.xsd
                
        <?xml version="1.0" encoding="UTF-8"?>
	<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	  <xs:element name="PurchaseOrder">
	    <xs:complexType>
	     <xs:sequence>
	       <xs:element name="orderFrom" type="xs:string"/>
	       <xs:element name="shipAddress">
	         <xs:complexType>
	           <xs:sequence>
	             <xs:element name="name" type="xs:string"/>
	             <xs:element name="address" type="xs:string"/>
	             <xs:element name="city" type="xs:string"/>
	             <xs:element name="country" type="xs:string"/>
	           </xs:sequence>
	         </xs:complexType>
	       </xs:element>
	       <xs:element name="billAddress">
	          <xs:complexType>
	            <xs:sequence>
	              <xs:element name="name" type="xs:string"/>
	              <xs:element name="address" type="xs:string"/>
	              <xs:element name="city" type="xs:string"/>
	              <xs:element name="country" type="xs:string"/>
	            </xs:sequence>
	          </xs:complexType>
	       </xs:element>
	       <xs:element name="item" maxOccurs="unbounded">
	         <xs:complexType>
	           <xs:sequence>
	      	    <xs:element name="title" type="xs:string"/>
	             <xs:element name="note" type="xs:string" minOccurs="0"/>
	             <xs:element name="quantity" type="xs:positiveInteger"/>
	             <xs:element name="price" type="xs:decimal"/>
	           </xs:sequence>
       		  <xs:attribute name="id" type="xs:string" use="required"/>
                    <xs:attribute name="type" type="xs:string" use="optional"/>
         	         </xs:complexType>
       	       </xs:element>
             </xs:sequence>
             <xs:attribute name="orderid" type="xs:string" use="required"/>
   	   </xs:complexType>
	</xs:element>
      </xs:schema>   
      

このスキーマには複雑なところはありません。この例を理解するためには、この XML スキーマの構文についても理解しておく必要があります。

ここで、リスト 2 のスキーマを利用した単純な XSLT 2.0 スタイルシートを作成し、このスタイルシートをリスト 1 の XML に適用します。リスト 3 には、このスタイルシート (名前は printitems1.xsl) のコードを示してあります。


リスト 3. printitems1.xsl
                
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      	              version="2.0">
             
        <xsl:output method="text" />
        
        <xsl:import-schema schema-location="po1.xsd" />
        
        <xsl:template match="document-node(schema-element(PurchaseOrder))">
           <xsl:for-each select="PurchaseOrder/item">
              <xsl:value-of select="@id" />: <xsl:value-of select="title" />
              <xsl:text>&#xa;</xsl:text>
           </xsl:for-each>
        </xsl:template>
      
        <xsl:template match="document-node()">
           <xsl:message terminate="yes">Source document is not a purchase order
           </xsl:message>
        </xsl:template>
      
      </xsl:stylesheet>
      

Saxon-SA 製品を使って次のように XSLT プロセスを呼び出します。

      
      java com.saxonica.Transform po.xml printitems1.xsl
      

これによって次のような出力が生成されます。

      Source document is not a purchase order
      Processing terminated by xsl:message at line 16 in printitems1.xsl
      

この場合、入力文書の妥当性が検証されなかったため、リスト 3 の 2 番目のテンプレートが呼び出されています。

今度は次のように XLST 変換を呼び出します。

java com.saxonica.Transform -val:strict po.xml printitems1.xsl

すると、次のような出力が生成されます。

      100: Water for Elephants
      101: Glass Castle: A Memoir
      200: 5 Amp Electric plug
      

この場合、入力文書は対応するスキーマによって妥当性が検証されたため、リスト 3 の最初のテンプレートが呼び出されています。

このスタイルシートを見ると、所定のスキーマによって入力文書の妥当性検証が行われた場合にのみスタイルシートの中で有効な処理を行える、ということがわかります。XML 文書の妥当性検証が行われなかった場合には、最初の出力の例でわかるように、スタイルシートは有効な処理を行うことはできません。




上に戻る


出力 XML 文書の妥当性を検証する

次の例では、シリアライズの前に出力ツリーの検証をどのようにして要求するのかを説明します。リスト 4 に printitems2.xsl という名前のスタイルシートを示しています。


リスト 4. printitems2.xsl
                
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      	               version="2.0">
             
        <xsl:output method="xml" indent="yes" />
        
        <xsl:import-schema>
          <xs:schema>
            <xs:element name="items">
              <xs:complexType>      
                <xs:sequence>
                  <xs:element name="item" maxOccurs="unbounded">
      	            <xs:complexType>
      	             <xs:sequence>
      	               <xs:element name="title" type="xs:string"/>
      	               <xs:element name="note" type="xs:string" minOccurs="0"/>
      	               <xs:element name="quantity" type="xs:positiveInteger"/>
      	               <xs:element name="price" type="xs:decimal"/>
      	             </xs:sequence>
      	             <xs:attribute name="id" type="xs:string" use="required"/>
      	             <xs:attribute name="type" type="xs:string" use="optional"/>
      	            </xs:complexType>
                  </xs:element>
                </xs:sequence>      
              </xs:complexType>
            </xs:element>
          </xs:schema>
        </xsl:import-schema>
        
        <xsl:template match="/PurchaseOrder">
          <items xsl:validation="strict">
            <xsl:copy-of select="item[price < 15]" />
          </items>
        </xsl:template>
      
      </xsl:stylesheet>
      

<items> タグでの xsl:validation="strict" オプションによって、変換動作から <items> 要素が生成される間に <items> 要素が検証されていることに注意してください。

次のようにして XSLT プロセスを呼び出します (入力の XML は同じままです)。

java com.saxonica.Transform po.xml printitems2.xsl

すると、次のような出力が生成されます。

<?xml version="1.0" encoding="UTF-8"?>
<items xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="200">
    <title>5 Amp Electric plug</title>
    <quantity>5</quantity>
    <price>10.10</price>
  </item>
</items>
      

これは期待したとおりの出力です。

このスタイルシートの一部を次のように変更する場合を考えてみましょう。

<xsl:template match="/PurchaseOrder">
  <itemsTag xsl:validation="strict">
    <xsl:copy-of select="item[price < 15]" />
  </itemsTag>
</xsl:template>
      

ルート要素の名前を「items」から「itemsTag」に変更したことに注意してください。先ほどと同じコマンド行を実行すると、次のような出力が生成されます。

      
      Error on line 32 of file:/E:/xml/sa-xslt/printitems2.xsl:
      XTTE1512: There is no global element declaration for itemsTag, 
      so strict validation will fail
      Failed to compile stylesheet. 1 error detected.
      

このエラーは変換中に起こりますが、インライン・スキーマによる出力ツリーの検証に成功しなかったことが原因です。これを見るとわかるように、XSLT 変換から無効な出力が生成されることはありません。

出力 XML ツリーの検証に関して、もう 1 つの興味深い例を見てください (リスト 5)。この例は、出力ツリーの別々の部分を異なるスキーマを使って検証するように要求するのかを示しています。


リスト 5. outputval.xsl
                
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                      xmlns:xs="http://www.w3.org/2001/XMLSchema"
                      exclude-result-prefixes="xs"
                      version="2.0">         
                      
           <xsl:output method="xml" indent="yes" />    
           
           <!-- import 1st schema -->
           <xsl:import-schema>    
             <xs:schema>      
               <xs:element name="x">        
                 <xs:complexType>                
                   <xs:sequence>            
                     <xs:element name="y" />          
                   </xs:sequence>              
                 </xs:complexType>      
               </xs:element>    
             </xs:schema>  
           </xsl:import-schema>    
           
           <!-- import 2nd schema -->
           <xsl:import-schema>    
             <xs:schema>      
               <xs:element name="p">        
                 <xs:complexType>                
                   <xs:sequence>            
                     <xs:element name="q" />          
                   </xs:sequence>              
                 </xs:complexType>      
               </xs:element>    
             </xs:schema>  
           </xsl:import-schema>    
           
           <xsl:template match="/">   
             <xsl:variable name="temp1">     
               <x>       
                <y/>     
               </x>   
             </xsl:variable>   
             <xsl:variable name="temp2">     
               <p>       
                <q/>     
               </p>   
             </xsl:variable>   
             <result>     
               <xsl:copy-of select="$temp1" validation="strict" />     
               <xsl:copy-of select="$temp2" validation="strict" />   
             </result> 
           </xsl:template> 
           
      </xsl:stylesheet>
      

ここで、次のように XSLT 変換を呼び出します。

        java com.saxonica.Transform outputval.xsl outputval.xsl

このコマンド行ではスタイルシートそのものを入力 XML として使っていることに注意してください。この場合、スタイルシートはダミーの入力 XML として動作しています。

上記のコマンド行を実行すると次のような出力が生成されます。

        <?xml version="1.0" encoding="UTF-8"?>
	<result>
	   <x>
	      <y/>
	   </x>
	   <p>
	      <q/>
	   </p>
        </result>

これは期待したとおりの出力です。ここでは 2 つのインライン・スキーマによってツリーのフラグメント (リスト 5 に太字で示してあります) の検証は問題なく成功したため、何も困ったことは起きていません。

今度はルート・テンプレート (xsl:template match="/") を次のように変更します。

     <xsl:template match="/">   
       <xsl:variable name="temp1">     
         <x>       
          <something/>   
         </x>   
       </xsl:variable>   
       <xsl:variable name="temp2">     
         <p>       
          <q/>     
         </p>   
       </xsl:variable>   
       <result>     
         <xsl:copy-of select="$temp1" validation="strict" />     
         <xsl:copy-of select="$temp2" validation="strict" />   
       </result> 
     </xsl:template>

ここでは、(リスト 5 の) 2 つのインライン・スキーマのどちらに対しても無効なジャンク・タグ、<something/> を導入しています。

ルート・テンプレートを上記のように変更して、リスト 5 のスタイルシートを実行します (同じコマンド行を使用します)。

今度は変換によって生成された出力は次のようになります。

        Validation error on line 47 of file:/E:/xml/sa-xslt/outputval.xsl:
	XTTE1510: In content of element <x>: The content model does not allow element
	<something>
	to appear here. Expected: y (See http://www.w3.org/TR/xmlschema-1/#cvc-complex
	-type clause 2.4)
        Transformation failed: Run-time errors were reported

生成されたマークアップで検証エラーが発生したため、変換は成功しませんでした。この例は、出力ツリーの中で検証を行う場所に関して XSLT 2.0 が非常に柔軟であることを示しています。




上に戻る


スキーマから型の情報をインポートする

今度はもう 1 つの例を見てみましょう。この例ではスキーマで定義されたユーザー型を関数のパラメーターとして使います。これは強力な概念であり、XSLT の型システムを無限に拡張できることを示しています。リスト 6 は、このスキーマ (名前は po2.xsd) を示しています。


リスト 6. po2.xsd
                
      <?xml version="1.0" encoding="UTF-8" ?>
      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        
        <xs:element name="PurchaseOrder" type="POType" />
          
        <xs:complexType name="POType">
          <xs:sequence>
            <xs:element name="orderFrom" type="xs:string"/>
            <xs:element name="shipAddress">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="name" type="xs:string"/>
                  <xs:element name="address" type="xs:string"/>
                  <xs:element name="city" type="xs:string"/>
                  <xs:element name="country" type="xs:string"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="billAddress">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="name" type="xs:string"/>
                  <xs:element name="address" type="xs:string"/>
                  <xs:element name="city" type="xs:string"/>
                  <xs:element name="country" type="xs:string"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="item" maxOccurs="unbounded">
               <xs:complexType>
                 <xs:sequence>
            	<xs:element name="title" type="xs:string"/>
                   <xs:element name="note" type="xs:string" minOccurs="0"/>
                   <xs:element name="quantity" type="xs:positiveInteger"/>
                   <xs:element name="price" type="xs:decimal"/>
                 </xs:sequence>
                 <xs:attribute name="id" type="xs:string" use="required"/>
                 <xs:attribute name="type" type="xs:string" use="optional"/>
               </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="orderid" type="xs:string" use="required"/>
       </xs:complexType>
      
      </xs:schema>      
      

このスキーマはリスト 2 の po1.xsd とほとんど違いがありません。唯一の違いは、スキーマの中で POType 型に明示的に名前を付けており、この型を匿名で使っているのではない点です。この型名を関数のパラメーターの中で使用します。

ここで、リスト 6 の po2.xsd スキーマを使用する ordersummary.xsl スタイルシートを実行してみます。このスタイルシート (リスト 7) は、サンプルの XML で表現された注文書に関する注文の要約を (XHTML として) 表示します。


リスト 7. ordersummary.xsl
                
      <?xml version="1.0" encoding="utf-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                      xmlns:xs="http://www.w3.org/2001/XMLSchema"
                      xmlns:my="http://localhost/myfunctions"
                      exclude-result-prefixes="xs my"
      	               version="2.0">
             
        <xsl:output method="xhtml" />
        
        <xsl:import-schema schema-location="po2.xsd" />   
        <xsl:import-schema namespace="http://www.w3.org/1999/xhtml"
             schema-location="http://www.w3.org/2002/08/xhtml/xhtml1-transitional.xsd"/> 
      
        <xsl:template match="/PurchaseOrder">
          <html xmlns="http://www.w3.org/1999/xhtml" xsl:validation="strict">
            <head>
              <title>Order Summary</title>
            </head>
            <body>
               <h2>Order from: <xsl:value-of select="orderFrom" /></h2>
               <table>
                  <tr>
                    <td>Item type</td>
                    <td>Total for the item type</td>
                  </tr>
                  <xsl:for-each-group select="item" group-by="if (@type) then @type 
                  else 'uncategorized item'">
                    <tr>
                      <td>
                        <xsl:value-of select="current-grouping-key()" />
                      </td>
                      <td>
                        <xsl:value-of select="my:categoryTotal(.., 
                        current-grouping-key())" />
                      </td>
                    </tr>
                  </xsl:for-each-group>
               </table>
               Total amount for the order: <xsl:value-of select="my:orderTotal(.)" /> 
            </body>
          </html>
        </xsl:template>
        
        <!-- function to find order amount for a particular category of items -->
        <xsl:function name="my:categoryTotal" as="xs:decimal">
          <xsl:param name="po" as="element(*, POType)" />
          <xsl:param name="category" as="xs:string" />
            
          <xsl:choose>
            <xsl:when test="not($category = 'uncategorized item')">
              <xsl:sequence select="sum($po/item[@type = $category]/price)" />
            </xsl:when>
            <xsl:otherwise>
              <xsl:sequence select="sum($po/item[not(@type)]/price)" />
            </xsl:otherwise>
          </xsl:choose>
        </xsl:function>
        
        <!-- function to find total order amount -->
        <xsl:function name="my:orderTotal" as="xs:decimal">
          <xsl:param name="po" as="element(*, POType)" />
          
          <xsl:sequence select="sum($po/item/price)" />
        </xsl:function>
      
      </xsl:stylesheet>
      

今度は次のようにして XSLT 変換を呼び出します。


      java com.saxonica.Transform po.xml ordersummary.xsl

これによって次のような出力が生成されます。

      
      
      Error on line 32 of file:/E:/xml/sa-xslt/ordersummary.xsl:
      XPTY0004: Required item type of first argument of my:categoryTotal() is element(*,
      POType); supplied value has item type element(PurchaseOrder, xs:anyType)
      In template at line 14 in file:/E:/xml/sa-xslt/ordersummary.xsl
      

このエラーが何を意味し、このエラーをどのように解決すればよいかを考えてみてください。入力 XML 文書を妥当性を検証しなかったので、XML ノードには適切な型注釈が追加されませんでした。その結果、要素ノードは xs:anyType 型を持ちました。エラーが起きた理由は my:categoryTotal 関数が POType 型のパラメーター値を想定していたためです。

この変換を次のように実行します。

java com.saxonica.Transform -val:strict po.xml ordersummary.xsl

コマンド行に -val:strict オプションが追加されていることに注意してください。この場合には、次のように適切な出力が得られます。

この例で、次のような興味深い点を考えてみてください。

  • 第 1 に、入力文書の妥当性が検証されたため、この関数には適切な型を持つ引数が渡されました。
  • 第 2 に、スタイルシートの中に <html xmlns="http://www.w3.org/1999/xhtml" xsl:validation="strict"> を追加することによって、XHTML 出力が XHTML スキーマに対して検証されています (このスキーマの場所は schema-location="http://www.w3.org/2002/08/xhtml/xhtml1-transitional.xsd" という属性値で指定されています)。

最後に、出力 XHTML 構文の中に構文エラーをいくつか紛れ込ませておくと、この XHTML スキーマによる検証が失敗することがわかります。XSLT プロセッサーは Web からスキーマを取得するため、マシンがインターネットに接続されている必要があることに注意してください。




上に戻る


まとめ

この記事ではスキーマ対応の XSLT システムの機能を説明しました。XLST スタイルシートをスキーマ対応にすると、次のようなメリットがあります。

  • 入力ツリーを検証し、型注釈を XML ノードに追加することで、ノードに対する操作を型に対応させることができます。またスタイルシートが無効な入力を処理しないようにすることができます。
  • 特定のスキーマを使って出力ツリーを検証することができるため、XSLT 変換から無効な出力が生成されないようにすることができます。
  • XSLT 変数、関数およびテンプレートのパラメーター、そして戻り値に対して型を割り当てることができます。これによって静的な型付け機能が強化されるため、スタイルシートのコンパイル・フェーズに効果があります。
  • コンパイル時の型チェックが強化されるため、後のフェーズでエラーが発生する可能性が低くなります。エラーが検出されるのが早期であればあるほど、その修正に費やす時間を短縮することができます。
  • スタイルシートの中でユーザー定義のスキーマ型を利用できるため、XSLT の型システムの拡張性が飛躍的に高まります。その結果、ビジネス上の問題の解決に対してスタイルシートが一層役立つようになります。


参考文献

学ぶために

製品や技術を入手するために
  • Saxonica: XSLT and XQuery Processing のサイトから、スキーマ対応の XSLT 2.0 プロセッサーである Saxon-SA の 30 日間無料の評価ライセンスをダウンロードしてください。この記事で紹介した例はすべて Saxon-SA を使ってテストされています。

  • AltovaXML のサイトから無料の AltovaXML 2008 をダウンロードしてください。この中には XSLT 1.0/2.0 エンジンと XQuery エンジン、そして XML バリデーターが含まれています。

  • 皆さんの次期開発プロジェクトを IBM trial software を使って構築してください。developerWorks から直接ダウンロードすることができます。


議論するために


著者について

Mukul Gandhi は IBM India のシニア・システム・アナリアストであり、Java™ 技術と Java EE (Java Platform, Enterprise Edition) をベースとするソフトウェア・システムの構築と設計を行っています。彼はデータの保存と交換のための柔軟でポータブルなフォーマットとして、作業の中で XML を使用しています。 彼は、IT 業界に1996年以来従事しており、2000年以来 XML 技術を扱っています。彼はインドの Allahabad でコンピューター・サイエンスおよびエンジニアリングの学位を取得しています。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


    日本IBMについて プライバシー お問い合わせ