XML文書のデータ構造に、あるXML文書フラグメント( XML部分ツリー構造)を追加するには、XVCDによるボキャブラリコンポーネントでコマンドを定義し、その中にXML文書のデータ構造にXML文書フラグメントを挿入するコマンドインストラクションを記述します。コマンドは、
xvcd:command要素を
xvcd:xvcd要素の子要素として記述して定義します。
XML文書のデータ構造にXML文書フラグメントを追加するコマンドインストラクションは、
xvcd:insertコマンドインストラクションです。このxvcd:insertコマンドインストラクションをコマンド定義内に記述します。xvcd:insertコマンドインストラクションのref属性には、挿入位置の基準となるノードをXPath式で指定します。xvcd:insertコマンドインストラクションのposition属性には、基準ノードに対する挿入位置を指定します。
xvcd:insertコマンドインストラクションの内容には、挿入したいXML文書フラグメントを記述します。この場合、ab:addressbook要素の子要素として
<ab:entry>
<ab:person/>
<ab:address/>
</ab:entry>
を挿入すればよいので、新しい住所エントリーを追加するコマンド定義は以下のようになります。 なお、コマンドには名前を付ける必要があります。ここでは、AddEntryという名前を付けます。 コマンドを呼び出すときは、コマンドに付けた名前を指定します。
<xvcd:command name="AddEntry">
<xvcd:insert ref="/ab:addressbook" position="last-child">
<ab:entry>
<ab:person/>
<ab:address/>
</ab:entry>
</xvcd:insert>
</xvcd:command>
定義したコマンドはこのままでは実行されません。メインメニューやコンテキストメニュー、ツールバー、イベントや他のコマンドから呼び出されることで実行できるようになります。メインメニューやコンテキストメニュー、ツールバーが選択されたときに呼び出されるコマンドの指定は、
xvcd:vocabulary要素内に
ui:ui要素で記述します。 詳しくは、ユーザーインターフェイス記述リファレンスをご覧ください。
ここでは、メインメニューに「Entry」というメニューを作り、その中の「Add」で住所エントリーを追加するようにします。
<xvcd:vocabulary name="AddressBook" match="ab:addressbook" call-template="root">
<ui:ui version="1.0">
<ui:main-menu>
<ui:menu label="Entry">
<ui:menu-item label="add" command="AddEntry"/>
</ui:menu>
</ui:main-menu>
</ui:ui>
<xvcd:vocabulary>
ここまでの内容をAddressBook.xvcdに適用すると、次のようになります。 強調文字で表記した箇所が、追加・変更された箇所です。 メニューに割り付ける記述が追加されたため、XML名前空間宣言xmlns:ui="http://xmlns.xfytec.com/ui"が追加されていることに注意してください。
<?xml version="1.0"?>
<xvcd:xvcd
xmlns:xvcd="http://xmlns.xfytec.com/xvcd"
xmlns:ui="http://xmlns.xfytec.com/ui"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ab="http://xmlns.xfytec.com/tutorial/addressbook"
version="1.0">
<xvcd:vocabulary match="ab:addressbook" name="AddressBook" call-template="root">
<ui:ui version="1.0">
<ui:main-menu>
<ui:menu label="Entry">
<ui:menu-item label="add" command="AddEntry"/>
</ui:menu>
</ui:main-menu>
</ui:ui>
</xvcd:vocabulary>
<xvcd:command name="AddEntry">
<xvcd:insert ref="/ab:addressbook" position="last-child">
<ab:entry>
<ab:person/>
<ab:address/>
</ab:entry>
</xvcd:insert>
</xvcd:command>
<xvcd:template name="root">
<html>
<body>
<table border="1" width="100%">
<tr>
<th width="150">
Name
</th>
<th>
Address
</th>
</tr>
<xvcd:apply-templates select="ab:entry"/>
</table>
</body>
</html>
</xvcd:template>
<xvcd:template match="ab:entry">
<tr>
<td>
<xvcd:apply-templates select="ab:person"/>
</td>
<td>
<xvcd:apply-templates select="ab:address"/>
</td>
</tr>
</xvcd:template>
<xvcd:template match="ab:person">
<xvcd:text-of select="." filler="Enter the name here."/>
</xvcd:template>
<xvcd:template match="ab:address">
<xvcd:text-of select="." filler="Enter the address here."/>
</xvcd:template>
</xvcd:xvcd>
編集が完了したら、AddressBook.xvcdを上書き保存します。
実際にxfy Basic Editionで表示しましょう。AddressBook.xmlをxfy Basic Editionで開いてください。メインメニューに[Entry]が追加されています。
メニューが追加された
[Entry-Add]を実行しましょう。最終行に住所エントリーが1行追加され、「Enter the name here.」/「Enter the address here.」と表示されます。
住所エントリーが追加された