• 締切済み

お願いします。

教えてください。 <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]" /> 等を試してみましたが、現在の値が抽出されてしまい失敗しました。参考ページでもいいので教えてください。お願いします。

  • XML
  • 回答数1
  • ありがとう数15

みんなの回答

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

 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の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中の改行、タブを無効にしたい。

    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
  • 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
  • 重複するものを消したい

    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
  • 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
  • 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
  • for-eachが上手くいきません

    xslを使ってごくごく基本的なことをしようとしているのですが、何故か上手くいかず煮詰まっています。 ここが違う!というツッコミを是非よろしくお願いします。 ごく単純なことですが、xmlで複数の<site></site>内にあるデータそれぞれ表示させるためxslファイル内でfor-eachを使っています。for-each抜きだと一つ目の<site></site>がちゃんと表示されるのですが、for-eachを付け加えた途端何も表示されなくなってしまいます。 参考書を見て何度確認、やり直しをしても上手くいかず困っています。 使っているコードは以下の通りです。 XMLファイル: <?xml version="1.0" encoding="Shift-JIS" ?> <?xml-stylesheet type="text/xsl" href="links.xsl" ?> <links> <site> <name>サイト1</name> <banner>some.jpg</banner> </site> <site> <name>サイト2</name> <banner>other.jpg</banner> </site> </links> XSLファイル: <?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> <head><title><title></head> <body> <table border="1"> <xsl:for-each select="links/site"> <tr> <td> <img> <xsl:attribute name="src"> <xsl:value-of select="links/site/banner" /> </xsl:attribute> </img> <b><xsl:value-of select="links/site/name" /></b> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> 何かアドバイスがありましたらお聞かせ下さい。

    • ベストアンサー
    • XML
  • XSLTで、あるノードの Text を別なノードの Name として参照

     変換したいXML文書の最初のトップレベルノードの階層をたどって text を拾っていくと、その text に一致する name のノードが次のトップレベルノードの階層で、出現するようになっています。  そこで、まず、最初のノードの階層をたどっていって、その順序で、2番目のノードから値を引いてきて表示させたいのです。 ■変換したい XML 文書 DataDocument.xml <datadocument> <setteischema> <sitem>solution <scategory>solution1</scategory> </sitem> <sitem>itsales <scategory>itsales1</scategory> </sitem> </setteischema> <setteivalue> <solution> <solution1>ソリューション1</solution1> </solution> <itsales> <itsales1>ITセールス1</itsales1> </itsales> </setteivalue> </datadocument> それに対して、適用したい XSL は次のようなものです。 ■変換命令を記述したXSL文書 StyleDocument.xsl <xsl:template match="setteischema" > <xsl:for-each select="*"> <xsl:variable name="foo" select="text()"/> <xsl:for-each select="*"> <xsl:variable name="bar" select="text()"/> <xsl:value-of select="★1" /> </xsl:for-each> </xsl:for-each> </xsl:template> 実際は★1の部分で setteivalue/$foo/$var といったパスで得られるノードのテキストを表示させたいのです。 どうしたらできますか? よろしくお願いします。

    • ベストアンサー
    • XML