• 締切済み
  • 困ってます

お願いします。

教えてください。 <ALL>  <ITEM>   <ITEMS>一</ITEMS>   <ITEMS2>1</ITEMS2>  </ITEM>  <ITEM>   <ITEMS>二</ITEMS>   <ITEMS2>2</ITEMS2>  </ITEM> </ALL> というようなXMLに <xsl:for-each select="ALL/ITEM">  <xsl:value-of select="ITEMS" /><BR /> </xsl:for-each> という処理をかけると、一<BR>二<BR>のように表示されますが、常に一番最初のITEMS(この場合、一)が欲しいときはどうすればいいのでしょうか。 <xsl:value-of select="ITEMS[1]" />や <xsl:value-of select="ITEMS[position()=1]" /> 等を試してみましたが、現在の値が抽出されてしまい失敗しました。参考ページでもいいので教えてください。お願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数49
  • ありがとう数15

みんなの回答

  • 回答No.1
  • jo-ji
  • ベストアンサー率72% (26/36)

 1つ目のITEMを選択しておいて、その中のITEMSの1番目を出力したい場合、 <xsl:for-each select="ALL/ITEM[1]">  <xsl:value-of select="ITEMS" /><BR /> </xsl:for-each> とすれば良いと思います。  すべてのITEMSの中で1番目を選択すると考えるなら、 xsl:for-eachを使わずに <xsl:value-of select=".//ITEMS[1]"/> または <xsl:value-of select=".//ITEMS"/> とすることもできます。  親がITEM要素でなければならないというような条件を付けることもできます。  ちなみに、xsl:value-ofは、属性selectで指定されたものを stringに変換して出力するもので、 node-setからstringへの変換は、1つ目のノードのstring-valueになる (XPathの仕様書を参照して下さい)ので、 以下の3つは同等です。 <xsl:value-of select="ITEMS" /> <xsl:value-of select="ITEMS[1]" /> <xsl:value-of select="ITEMS[position()=1]" />

参考URL:
http://www.w3.org/TR/1999/REC-xpath-19991116

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 一つ前の値

    <ALL>  <EX attr='3'><NAME>B</NAME></EX>  <EX attr='2'><NAME>B</NAME></EX>  <EX attr='1'><NAME>A</NAME></EX> </ALL> というXMLをつくり <xsl:for-each select="ALL/EX">  <xsl:sort select="./NAME"/>  <xsl:sort select="./@attr"/>  NAME:<xsl:value-of select="NAME"/>  attr:<xsl:value-of select="@attr"/><BR/> </xsl:for-each> というXSLにかけると  NAME:A attr:3  NAME:B attr:1  NAME:B attr:2 という結果が得られました。これを  NAME:A attr:3  NAME:B attr:1        attr:2 のように、現在のNAMEが前のNAMEと同じ場合は表示しない ようにしたいのですが上手くいきません。 参考書には現在のNAMEとpreceding-sibling::EX/NAME の値を比較すると良いと書いてあったので preceding-sibling::EX/NAMEの値を取ってみたのですが  NAME:A attr:3 preceding:B  NAME:B attr:1 preceding:B  NAME:B attr:2 preceding: と、なってしまいます。 良い方法はありませんでしょうか教えて下さい。

    • ベストアンサー
    • XML
  • value-ofの値を属性値とするには

    やりたいことをストレートに書くとこうなんです。 XSLファイル内 <xsl:for-each select="USERS/USER/">  <input name="UserID" type="hidden" value=" <xsl:value-of select="@ID"/> "/> </xsl:for-each> 当然構文エラーでますよね… この回避方法をご存じの方いませんか? ちなみに <xsl:for-each select="USERS/USER/">  <xsl:value-of select="@ID"/> </xsl:for-each> で、値は取れたんですけど…大雑把な説明で申し訳ありません。

    • ベストアンサー
    • XML
  • xslでの最小値、最大値の取得

    <A>  <B>50</B>  <B>20</B>  <B>5</B>  <B>60</B>  <B>100</B> </A> 例えば上のようなXMLがあったとします。 それにxslを適用したときに、最小値と最大値のみを表示させたいのですが、xslではどのような処理をすればよいのでしょうか? <xsl:for-each select="A">  <xsl:sort select="./B"/>  <xsl:value-of select="."/> </xsl:for-each> 上のようだと全ての<B>が昇順に表示されるだけです。 何か最小値、最大値を取得する関数等ありますでしょうか?

    • ベストアンサー
    • XML
  • xslのdocument関数で読込んだ2つのxmlをxsl:sortしたい

    次のXSLで動作させています。 <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xml:space="default" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <xsl:output method="text" /> <xsl:template match="/"> <xsl:for-each select="document('取り込むXMLファイル')//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> <xsl:for-each select="//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> </xsl:template> </xsl:stylesheet> ここまでは出来たのですが、xsl:sortでまとめてsortするにはどうすればいいのでしょうか?

    • ベストアンサー
    • XML
  • xslでの表示

    例えば <title>タイトルA</title> <P>no1</P> <P>no2</P> <P>no3</P> <P>no4</P> <title>タイトルB</title> <P>no5</P> <P>no6</P> <P>no7</P> <P>no8</P> というようなxmlがあったとします。 xslを適用して、 タイトルA no1 no2 no3 no4 タイトルB no5 no6 no7 no8 と表示するにはどのようにすればよいのでしょうか? <xsl:for-each select="//P">  <P><value-of select="."/></P> </xsl:for-each> ではnoのみが表示され、タイトルが表示されず、また、 <xsl:for-each select="//title">  <P><xsl:value-of select="."/></P>  <xsl:for-each select="../P">   <P><xsl:value-of select="."/></P>  </xsl> </xsl> では、 タイトルA no1 no2 no3 no4 no5 no6 no7 no8 タイトルB no1 no2 no3 no4 no5 no6 no7 no8 となってしまいます。

    • ベストアンサー
    • XML
  • Document関数とPosition関数について

    みなさんよろしくおねがいします。 早速ですが、 ソース"a.xml"のテンプレートファイル"b.xsl"にdocument関数を使い、"c.xml"を読ませています。 また、この"c.xml"のデータの内容をposition関数を使い、3列ずつの表として表示させています。 ここまでは問題なかったのですが、4列構成にして1列目に見出し的項目(<mmm>タグ)を追加すべく ifにて<ccc>のpositionが"1"の時だけそこの横に表示させるという様に構築してみましたがうまくいきません。 (注1)の部分の代わりに <xsl:variable name="c"select="document('c.xml')/d/data"/> <xsl:for-each select="$c/c/ccc[position() mod 3 = 1]"> としてみましたが、同様でした。 その後、不具合検証の為(注2)の部分に <td><xsl:value-of select="position()" /></td> をいれ、きちんとカウントされているか調査したところ、 正常なら1.2.3.4.5で繰り返し1.2.3.4.5.6となるところですが 頭から通しで1~11となっていました。 また、これらと同様の、document関数を使わないで単純なテンプレートとして "d.xsl"を作り、変換したところ、問題なく正常に表記されました。 ヒントなどでも結構です、問題点の御指摘 よろしくおねがいします。

    • 締切済み
    • XML
  • xsl:if で行の属性の存在を調べる方法

    (XML詳しくないため、用語がおかしいかもしれません) 次のようなXMLデータがあります。 <ABC A="true" B="xxx" C="xxx" /> <ABC B="xxx" C="xxx" /> Aという属性が存在しているデータを取り除こうとしています。 1データは、A="true"が存在しているか、全く存在しないか、どちらかです。 そこで私は、次のようなXSL文を書いてみました。 <xsl:for-each select="xxxx"> <xsl:if test="A != 'true'"> <xsl:value-of select="xxxx" /> : : </xsl:if> </xsl:for-each> しかし、データは全く出力されません。 <xsl:if test="A = 'true'"> だと、Aがtrueのデータが出力されます。 A自体が存在しないデータを抽出するには、どのようにすればよいでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • XML
  • 重複するものを消したい

    XMLをXSLでHTMLを生成しています。 変数$whereにある店の部分名を入力して その店の扱う商品を表示したいと思っています。 しかし、以下の例だと チョコレート 本 本 うめぼし のようになってしまいます。 チョコレート 本 うめぼし のように表示するにはどうすればよいでしょうか? ご教授ください。 XMLが以下のようになっています。 ()は要素の中身 list item title(チョコレート) value(200円)   shops shop(○○ストア)    shop(スーパー△△)   shop(駄菓子屋□□)  item title(本)   value(1000円)   shops shop(○○ブックス)    shop(△△百貨店)    shop(スーパー△△)  item title(うめぼし)   value(100円)   shops shop(スーパー○○)    shop(△△百貨店)    shop(通販○○) list そしてXSLは <xsl:apply-templates select="list/item/shops"> で飛ばして <xsl:template match="shops"> <xsl:for-each select="shop"> <xsl:if test="contains(.,$where)"> <xsl:value-of select="../../title[not(.=preceding::title)]"/> </xsl:if> </xsl:for-each> </xsl:template>

    • 締切済み
    • XML
  • ファイルサーバの日本語フォルダ名へのリンク

    勉強しはじめで質問内容にも至らない点があるかと思いますが何卒アドバイスをお願いいたします。 イントラを作成するにあたり、ファイルサーバー上の日本語名フォルダにリンクしたいのですが、文字化けをしてしまいます。ソースは下記のような感じです。 ■xmlファイル「test.xml」 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <root> <item> <title>日本語フォルダ名</title> <link>\\test01¥テストデータ</link> </item> <item> <title>管理</title> <link>\\test01\経費管理</link> </item> </root> ■xslファイル「test.xsl」 <?xml version="1.0" encoding="utf-8"?><!-- DWXMLSource="test.xml" --> <!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " ">  中略 <!ENTITY euro "?"> ]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="utf-8"/> <xsl:template match="/"> <xsl:for-each select="root/item"> <a href="{link}"><xsl:value-of select="title"/></a><br /><br /> </xsl:for-each> </xsl:template> </xsl:stylesheet> これをオーサリングソフト(Dreamweaver8を使用)でプレビューすると、日本語フォルダ名が文字化けをしてしまいリンクができません。 ファイル名を半角英数にすれば済む話ではあるのですがあまりに大量のファイルがあるのと、管理上の問題でフォルダ名はなんとか日本語のままで使用したく考えております。 お手数ですが回避策、代替案などございましたら教えていただけると助かりますので何卒よろしくお願い申し上げます。

    • ベストアンサー
    • XML
  • XSL中の改行、タブを無効にしたい。

    XMLドキュメントにXSLを適用すると XSL中の改行やタブがそのまま反映されてしまいます。 改行を無くすと1行が長くなってしまい編集が大変で困っています。 どうしたらよいのでしょうか? XSL: <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xml:space="default" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <xsl:output method="text" /> <xsl:template match="/"> <xsl:for-each select="//z:row"> <xsl:choose> <xsl:when test="(@MACHINE='DELL')"> </xsl:when> <xsl:when test="(@MACHINE='APPLE')"> </xsl:when> <xsl:when test="(@MACHINE='HP')"> </xsl:when> <xsl:otherwise> <xsl:value-of select="@MACHINE" />, <xsl:value-of select="substring(@PARTS_NO,1,1)" />-<xsl:value-of select="substring(@PARTS_NO,2,3)" />-<xsl:value-of select="substring(@PARTS_NO,5,3)" />-<xsl:value-of select="substring(@PARTS_NO,8,2)" />,<xsl:value-of select="@STATUS" />,<xsl:value-of select="@STOCK_NUM" /><xsl:text>&#xA;</xsl:text> <xsl:if test="not(@MACHINE=following-sibling::z:row/@MACHINE)"> <xsl:text>,&#xA;</xsl:text> </xsl:if> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> </xsl:stylesheet>

    • ベストアンサー
    • XML