- PR -

XSLTで要素を選択して表示する方法

1
投稿者投稿内容
まちゃあき
会議室デビュー日: 2001/10/18
投稿数: 4
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2001-10-18 01:18
現在XSLTを勉強中のXML初心者です.
非常にたくさんの要素からなるXMLからある部分の要素だけを取り出してブラウザに表示する方法に悩んでおります.

■例
<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet href="sample1.xsl" type="text/xsl" ?>
<?cocoon-process type="xslt" ?>
<article>
<title>XSLT入門</title>
<paragraph>
  <para1>この記事はXSLTについて</para1>
<para2>理解していただくことを目的としたものです</para2>
 </paragraph>
</article>

からpara1の値のみをブラウザに表示させようと次のようなXSLTを書きました

<?xml version="1.0" encoding="shift_jis" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="article/paragraph/para1">
<html><xsl:apply-templates/></html>
</xsl:template>
</xsl:stylesheet>

■結果
・cocoonではエラー
・ローカルでは1行に値が表示されるのみ

どのようなXSLTを書けば求める結果が得られるのでしょうか?
もしかしたら,そもそもこのようなことはできないのでしょうか?
(目的の要素だけを自動生成するなどしなければならない?)

初歩的な質問で申し訳ありませんが,よろしくお願いいたいます.




 
井上孝司
ぬし
会議室デビュー日: 2001/09/08
投稿数: 668
お住まい・勤務地: 東京都
投稿日時: 2001-10-18 02:14
ただ単に単一の要素の値を取ってくるだけなら、テンプレートを作らなくても
可能ではないかと思います。

<?xml version="1.0" encoding="shift_jis" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/">
<html>
<body>
<xsl:value-of select="article/paragraph/para1" />
</body>
</html>
</xsl:template>
</xsl:stylesheet>

と、こんな調子でいかがでしょうか。
_________________
www.kojii.net
みのる
会議室デビュー日: 2001/09/10
投稿数: 7
投稿日時: 2001-10-18 14:25

> <xsl:template match="/">
> <xsl:apply-templates/>
> </xsl:template>

このテンプレートでは、
「ルートノードの子ノード(この場合はarticle)にテンプレート適用」と
なっているのですが、その子ノードを処理するテンプレートが存在しないのが
原因ではないでしょうか。
そのため、para1まで到達できないのでは?

> <xsl:template match="article/paragraph/para1">

これは「エレメントノードpara1のなかで、先祖がarticle/paragraphである
ものに適応」という意味だと思います。
つまり、「article/paragraph」は「para1」についての条件であって
「article→paragraph→para1と辿る」わけではない、と。
ですから、ココまで届くようにしてあげないとまずいと思います。

たとえば、

<xsl:template match="/">
<xsl:apply-templates select="article/paragraph/para1" />
</xsl:template>
<xsl:template match="para1">
....
</xsl:template>

とか、

<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="article">
<xsl:apply-templates select="paragraph" />
</xsl:template>
<xsl:template match="paragraph">
<xsl:apply-templates select="para1" />
</xsl:template>
<xsl:template match="para1">
...
</xsl:template>

というようにしてはいかがでしょうか?

※私も勉強中ですので理解が変でしたら、ご指摘ください。
まちゃあき
会議室デビュー日: 2001/10/18
投稿数: 4
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2001-10-18 14:26
inopee様

ありがとうございます.欲しかった結果が得られました.

<xsl:apply-templates />
に対する理解が不足していたためだと思います.

こんな単純なことでも初心者の私はうだうだと悩んでいました.
本当にありがとうございました.
まちゃあき
会議室デビュー日: 2001/10/18
投稿数: 4
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2001-10-18 15:59
みのる様

ありがとうございます.

>これは「エレメントノードpara1のなかで、先祖がarticle/paragraphである
>ものに適応」という意味だと思います。
>つまり、「article/paragraph」は「para1」についての条件であって
>「article→paragraph→para1と辿る」わけではない、と。
>ですから、ココまで届くようにしてあげないとまずいと思います。

確かに指摘どおり理解するとエラーに納得がいきますね!


1

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