人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

XMLをXSLを使って変更するときにdocument関数で変数を使いたいのですがうまくいきません。

A.xml,B.xml,共通.xml,共通.xslがあります。共通.xmlにはA.xml,B.xmlをインクルードしており、
A.xmlのノード内容はXMLファイルへのパス名(1_1/section.xml)が入っており、
<xsl:variable name=”変数” select=”root/fileName” />
で取得して、表示するところまでは出来たのですが、これをつかって
<xsl:value-of select=”document(’1_1/section.xml’)/Item/text[lang($lang)]” />
を下記のように変えようと
<xsl:value-of select=”document(’変数’)/Item/text[lang($lang)]” />
にしたのですが上手くいきません。

<xsl:for-each select=”document(’<xsl:value-of select=”A.xmlのうちのどれか”/>’)”></xsl:for-each>
やりたいことはこのような感じなのですが、どなたか方法が解る方がいらっしゃいましたら教えていただけませんでしょうか。
よろしくお願いします。

●質問者: buriki8
●カテゴリ:ウェブ制作
✍キーワード:XML XSL インクルード ノード パス
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● zizz_walla
●20ポイント

<xsl:value-of select=”document($変数)/Item/text[lang($lang)]” /> ではないでしょうか?

◎質問者からの返答

書籍のサンプルなどでも、お答えいただいたように「$」をつけていたのでやってみたのですが表示されませんでした。変数として使えていないのでしょうか?


2 ● matsu911
●20ポイント

<xsl:variable name=”変数” select=”root/fileName” />

と変数を宣言したならば、

<xsl:value-of select=”document($変数)/Item/text[lang($lang)]” />

こうするべきではないですか?

document(’変数’)としてしまうと、「変数」というファイル名のファイルをさしてしまいます。

◎質問者からの返答

質問文が適切でなかったです。すみません。

シングルクォーテーションの中で変数の値が使いたいということでこのような書き方をしてしまいました。お答えいただいた形にした場合に変数が取れない状況です。


3 ● matsu911
●20ポイント

<xsl:value-of select=”document(¥’$変数¥’)/Item/text[lang($lang)]” />

「¥(バックスラッシュ)」でエスケープしてはどうでしょう?

◎質問者からの返答

試して見ましたが、シングルクォーテーションは不要のようですので駄目でした。


4 ● zizz_walla
●80ポイント

これまでの情報から考えられる原因のチェックリストをあげておきます。

・相対パス指定を使用されているようですが、ファイルのパスは正しい結果が得られているでしょうか。

・xsl:variableに全角文字を使っていれば半角に変えてみる。#qname指定なので問題ないはずなのですが。

・文字コードが正しいか。(特に指定していない場合、UTF-8で保存されているか。)

以下のようなxslで動作することを確認しています。

--- test.xsl ---

<?xml version=”1.0”?>

<xsl:stylesheet xmlns:xsl=”

http://www.w3.org/1999/XSL/Transform

XSLT namespace

version=”1.0”>

<xsl:template match=”/”>

<html>

<head><title>test</title></head>

<body>

<xsl:apply-templates select=”root/index”/>

</body>

</html>

</xsl:template>

<xsl:template match=”index”>

<xsl:variable name=”index” select=”.”/>

<xsl:value-of select=”$index”/><br/>

<xsl:variable name=”変数” select=”document($index)/root/filename”/>

<xsl:value-of select=”$変数”/><br/>

<xsl:value-of select=”document($変数)/Item/text” /><br/>

</xsl:template>

</xsl:stylesheet>

--- test.xml ---

<?xml version=”1.0”?>

<?xml-stylesheet type=”text/xsl” href=”test.xsl” ?>

<root>

<index>index_a.xml</index>

<index>index_b.xml</index>

</root>

--- index_a.xml ---

<?xml version=”1.0”?>

<root>

<filename>data_a.xml</filename>

</root>

--- index_b.xml ---

<?xml version=”1.0”?>

<root>

<filename>data_b.xml</filename>

</root>

--- data_a.xml ---

<?xml version=”1.0”?>

<Item>

<text>A</text>

</Item>

--- data_b.xml ---

<?xml version=”1.0”?>

<Item>

<text>B</text>

</Item>

◎質問者からの返答

ありがとうございます。わかりやすくてとても勉強になります。document関数で変数を扱うことができることと、変数の中にスラッシュを使うことができることが確認でき一歩前進しました。

注意点についてUTF-8、全角文字については確認しました。相対パス指定については、そのまま書いた場合はパスが通るので間違いないと思うのですが・・・。


5 ● ikairoku
●20ポイント

明示的にstringを返すようにしたらどうでしょう。

document(string($変数))

ちなみに、

document(concat(”../dir/”,$para,”/hoge.xml”))

こんなやり方で問題なく動いてますよ。

◎質問者からの返答

ありがとうございます。試して見たのですがうまくいきませんでした。もう少し詳しく質問をしなおします。一度終了させていただきます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ