- PR -

document関数について

1
投稿者投稿内容
buriki8
会議室デビュー日: 2005/02/03
投稿数: 5
投稿日時: 2005-02-03 00:23
日本語と英語のバイリンガルサイトを作っているのですがわからないところがあります。
index.xml・a.xml・b.xml・index.xsl・lang.xmlの5つのファイルがあります。

index.xsl・lang.xmlは一番上の階層に
その1つ下の階層にa.xml
そのもう1つ下の階層にb.xmlとindex.xmlを配置しています。
3階層のフォルダ構造です。

index.xmlには、a.xml・b.xmlのパスを記述しています。

<File>
<filePath>
<sourceFile>test1/a.xml</sourceFile>
<sourceFile>test1/test1_1/b.xml</sourceFile>
</filePath>
</File>

a.xmlの中には、日本語と英語の文章があり、xml:lang属性をつけています。(jpとen)
<Section>
<Item>
<ItemName1>
<text xml:lang="jp">日本語</text>
<text xml:lang="en">English</text>
</ItemName1>
</Item>
</Section>
b.xmlも同様です。

index.xmlにindex.xslを適用してHTMLを表示しています。
a.xmlとb.xmlのテキスト内容を表示するために
<xsl:value-of select="document('test1/a.xml')/Section/Item/ItemName1/text[lang($lang)]" />
<xsl:value-of select="document('test1/test1_1/b.xml')/Section/Item/ItemName1/text[lang($lang)]" />

と記述すると、きちんとa.xml・b.xmlの内容が表示されるのですが、document('test1/a.xml')の部分を共通化して
使いたいので、変数を使って書いてみました。
<xsl:variable name="sectNum" select="sourceFile[1]" />
<xsl:value-of select="document($sectNum)//Section/Item/ItemName1/text[lang($lang)]" />
こうすると、XMLファイルを読み込めませんというエラーが出てしまい、テキストの内容を表示することが出来ません。
初めは変数が取れていないのかと思ったのですが
<xsl:value-of select="$sectNum" />
と記述すると、
test1/a.xml
が表示されます。
b.xmlの方も同様です。

変数を使った下記のような表記は出来ないのでしょうか?
<xsl:value-of select="document($sectNum)/Section/Item/ItemName1/text[lang($lang)]" />

長文で申し訳ありません。どうかよろしくお願い致します。
仕様OS:WindowsXP Pro
ブラウザ:IE6
BLACK
会議室デビュー日: 2005/01/13
投稿数: 2
投稿日時: 2005-02-07 02:53
document関数の第一引数が結果的に相対URIになる場合、その第一引数が文字列かノード集合かによって、挙動が異なります。

第一引数が「文字列」で相対URIになる場合、第二引数が省略された時は、スタイルシート自身が持つ基底URIを使って絶対URIを導きますので、スタイルシートから見た相対URIという事になります(厳密にいうと、document関数が指定されいるノードの持つ基底URIです)。結果、buriki8さんの構造でいうと、(スタイルシートindex.xslがルート直下にあると仮定すると)絶対URIは/test1/a.xmlです。

それに対し、第一引数が「ノード集合」で文字列値が相対URIになる各々のノードの場合、第二引数が省略された時は、その各々のノードが持っている基底URIを使って絶対URIを導きます。buriki8さんの例でいうと、$sectNumにバインドされているのはsourceFile[1]ですので、文字列のtest1/a.xmlが相対URIになり、それを解決する為の基底URIはsourceFile[1]の持つ基底URI、即ちindex.xmlの持つ基底URIという事になり、/test1/test1_1/index.xmlから見た相対URIという事になります。結果、絶対URIは/test1/test1_1/test1/a.xmlという訳です。そんなファイルはありませんので、エラーになるという事です。

これを回避するには、共にスタイルシートから見た相対URIと言う事にすれば良いので、第二引数にその基底URIを持つノード集合、即ちスタイルシート自身を指定すれば良いのです。
ですので、
<xsl:value-of select="document($sectNum,document(''))/Section/Item/ItemName1/text[lang($lang)]" />
にすれば希望通りの結果になるかと思います。
buriki8
会議室デビュー日: 2005/02/03
投稿数: 5
投稿日時: 2005-02-10 13:47
BLACK様
返信が遅れてしまいまして申し訳ございません
詳しい解説ありがとうございます。
いろいろと試しているうちに、index.xmlに記述しているほうのファイルへのパスに
「../../」をつけるとうまくいったのですが、なぜそうなるのか理解できずにいました。
BLACK様の書き込みを見て納得できました。document関数の指定方法もやってみましてうまくいきました。本当にありがとうございます。
まだまだわからないことが多くあります。これからもどうかよろしくお願い致します。
1

スキルアップ/キャリアアップ(JOB@IT)