ユーザー定義テンプレート

www.altova.com このトピックを印刷 前のページ 1つ上のレベル 次のページ

ホーム >  SPS ファイル: 構造 > テンプレートと デザインフラグメント >

ユーザー定義テンプレート

ユーザー定義テンプレートとは、XPath 条件式により生成されるアイテムに対して適用されるテンプレートのことです。これらアイテムは原子型の値またはノードとなります。以下のスクリーンショットでは3つのユーザー定義テンプレートが示されており、タグの左側にユーザー定義テンプレートアイコンが示されます。ユーザー定義テンプレートが持つ柔軟性により、テンプレートを作成することができます。 ユーザー定義テンプレートにより生成されたコンテンツは Authentic ビューで編集することはできない点に注意してください。

 

UserDefTemplates

 

上に示されるこれら3つのユーザー定義テンプレートに対して定義された XPath  条件式により、以下の処理が行われます:

 

 

ソーススキーマ内のノードを選択します。XPath 条件式を使用することで、全てのコンテキストノードから、任意のスキーマソース内にある任意のノードへアクセスすることができるようになります。曖昧性が無いかたちで StyleVision が定義されたノードを識別することができる場合、テンプレートはユーザー定義テンプレートから(Authentic View における編集が可能な) 通常のテンプレートへ自動的に変換されます。ユーザー定義テンプレートの場合、テンプレートタグの左側にユーザー定義テンプレートを表す緑色のアイコンが表示されます。
XPath 2.0 と XPath 3.0 for コンストラクトにより指定された条件を満たすノードを選択します。このようなテンプレートは StyleVision に通常のテンプレート( ユーザー定義テンプレート) を明確に解決することを許可しません。
原子型の値のシーケンス(1、2、3)を選択します。原子型の値に対してテンプレートを作成することは可能ですが、このようなテンプレート内でコンテンツプレースホルダを使用することはできません。これは、(コンテンツプレースホルダにより生成される)xsl:apply-template 処理命令が、(原子型の値ではなく)ノードアイテムにしか適用できないためです。そのかわり、箇条書きといったデザイン要素とともに、自動計算を使用することは可能で、以下のスクリーンショットの左側にあるユーザー定義関数により、右側のような出力が生成されます。

 

UDefTemplateAtomicValsDes        UDefTemplateAtomicValsOut

 

メモ:SPS にて XSLT 1.0 が使用されている場合、XPath 条件式の返り値をノードセットにする必要があり、そうでない場合エラーとなります。

 

 


 

 

XPath を使ったテンプレートノードの選択を行う利点

スキーマノードを XPath 条件式(ユーザー定義テンプレート)により選択することで、XPath のパスセレクターメカニズムを使ったアイテムノードやシーケンスの選択を行うことができるようになり、ノードの選択に対してフィルタリングや条件をセットすることが可能になります。そのため、特定の XML ドキュメントノードを、任意のテンプレートに対して使用することができるようになります。例えば、//Office/Department[@Location="NY"] という XPath 条件式により、NY という値を持った Location 属性が含まれる Department ノードだけが選択されます。このセクション内にあるその他の例も参照ください。

 

メモ:XPath 条件式に複数のロケーションパスやロケーションステップが含まれる場合、複数のロケーションパスやステップ内に括弧が使用されているかがグループ化や並び替えを行う際に重要になります。例えば、/Org/Office/Dept という XPath 条件式は、(/Org/Office/Dept) という条件式とは異なった方法で処理されます。括弧を伴わない条件式では、各ロケーションステップが繰り返されるのに対して、括弧付きの条件式の場合、全ての Office 要素にある全 Dept 要素が、1つのノードセットにより返されます。

 

括弧

実際の XSLT メカニズム

効果

無し

<xsl:for-each select="Org">

 <xsl:for-each select="Office">

   <xsl:for-each select="Dept">

    ...

   </xsl:for-each>

 </xsl:for-each>

</xsl:for-each>

Office 要素には独自の Dept が含まれ、グループ化や並び替えは、各 Office 内部で行われる。

有り

<xsl:for-each select="/Org/Office/Dept">

 ...

</xsl:for-each>

Dept 要素が、全ての Office ならびに Org 要素に対して展開される。

 

グループ化や並べ替えを行う際に XPath 条件式の評価方法が大きな違いをもたらします。

 

 


 

 

ユーザー定義テンプレートを挿入する

以下の操作によりユーザー定義テンプレートを挿入することができます:

 

1.デザイン要素の挿入ツールバーにあるユーザー定義テンプレートを挿入アイコンをクリックし、デザイン内のテンプレートを挿入する場所をクリックします。または、テンプレートを挿入する場所を右クリックし、コンテキストメニューからユーザー定義テンプレートを挿入コマンドを選択します。
2.In the XPath 式を編集 ダイアログにて XPath 条件式を入力し、OK をクリックします。XPath 条件式のコンテキストノードは、クリックされたノードになる点に注意してください。空のノードテンプレートが作成され、場合によっては結合されたノードが作成されます。ノードが結合されると、ターゲットとなるインスタンスノードが同一のレベルにて選択されるのに対し、ノードが結合されていない場合(つまり複数の階層レベルにて分割されている場合)、ループにより各インスタンスノードが選択されます。グループ化や並べ替えが行われない限り、(結合または分割により)返された両者のノードセットに違いはありません。結合されたノードがグループ化や並べ替えメカニズムでどのように扱われるかの詳細については、: ノードテンプレートオペレーション を参照してください。

 

 


 

 

テンプレートマッチの編集

任意の(ユーザー定義または通常の)ノードテンプレートに対する選択は、新たな XPath 条件式により変更することができます。ノードテンプレートのテンプレートマッチを編集するには、ノードテンプレートを右クリックし、テンプレートマッチの編集コマンドを選択します。XPath 条件式を編集するためのダイアログが表示されるので、新たなノードを選択する XPath 条件式を入力し、「OK」 をクリックします。

 

 


 

 

ユーザー定義テンプレートにノードを追加する

SPS のスキーマソースコンテキスト内に配置することができないノードまたはシーケンスに対してユーザー定義テンプレートが作成された場合、スキーマツリーから得られたノードがユーザー定義テンプレートへ追加される時に、新たなノードのコンテキストが決定できなくなります。そのため、新たなノードが、(i) 名前で(つまり相対パスで)参照されるのか、または (ii) スキーマソースのルートからのフルパスにより参照されるのか決定するよう促されます(以下のスクリーンショットを参照)。

 

UnknownContextNode

 

どのような動作を行うか、確認するのがデフォルトの振る舞いになっています。 「ツール | オプション ダイアログ」のデザインタブにて、デフォルトの振る舞いを変更することができます。

 

 


(C) 2019 Altova GmbH