• ベストアンサー

XMLから指定テキストのみを抜き出すXSLについて

次のようなXMLからhide属性ない箇所のテキストのみを抜き出したいのですが、 どうすればよいでしょうか? [xml] <data> ××××<a hide="hide">○○○○○○○○○○○○</a>・<a>◎◎◎◎◎<b hide="hide">●●●</b>▲▲▲▲</a>△△△△ </data> [求める結果] ××××・◎◎◎◎◎▲▲▲▲△△△△

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

<?xml version="1.0" encoding="UTF-8"?> <data> ××××<a hide="hide">○○○○○<c>*****</c>○○○</a>・<a>◎◎◎◎◎<b hide="hide">●●●</b>▲▲▲▲</a>△△△△ </data> ================================== <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <test> <xsl:apply-templates /> </test> </xsl:template> <xsl:template match="*"> <xsl:choose> <xsl:when test="count(@hide) > 0"> </xsl:when> <xsl:otherwise> <xsl:apply-templates /> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> ============結果===================== <?xml version="1.0" encoding="UTF-8"?> <test>××××・◎◎◎◎◎▲▲▲▲△△△△</test> ===================================== * 特に指示がなかったので、c要素のように「その要素自身にはhide属性はないが、その親にhide属性がある」ような要素は内容を表示しないことにした。特に指示がなかったので、その要素の名前空間(接頭辞がない奴)以外の「接頭辞のある属性」についてはhide属性としては扱わないものとしている。(今後指示がついてもやらないけど) * 今考えると、xsl:apply-templatesのselect属性に指定するXPathで、hide属性のない要素だけが対象となるようにしてもよかったかも、とも思うがまぁいいや。

w0a15455
質問者

お礼

ありがとうございました。 ずっと悩んでいたんですが、スッキリです。 >* 今考えると、xsl:apply-templatesのselect属性に指定するXPathで、hide属性のない要素だけが対>象となるようにしてもよかったかも、とも思うがまぁいいや。 出来たら、こっちのやり方も教えてもらえるとうれしいです。 今後の参考のために、よろしくお願いします。

w0a15455
質問者

補足

<xsl:apply-templates select="data/text() | data//*[not(@hide='hide') and not(../@hide='hide')]/text()" /> のような形かな?っと思いますが、親階層にhide属性がある場合(複数階層の場合)、表示されてしまいます。 全ての親階層をたどり判断するようなことは出来ないのでしょうか?

関連するQ&A

  • XSLで親の取得方法

    次のようなXMLで、<item>の位置より<a>配下なのか<b>配下なのかを 知る方法はないでしょうか? local-name(..)とかで、名前を調べようかと思いましたが、 実際は、もっと深く潜っているということと、複数箇所にわかれるて いることから、local_name(..)の方法は、ちょっと無理だと思っています。 -XML-------------------- <data> <a><item>アイテムA</item></a> <b><item>アイテムB</item></b> </data> ------------------------ ご指導ください。よろしくお願いします。

    • ベストアンサー
    • XML
  • XMLとかで出来ますか?

    XMLもXSLもXSLTも何も知らないので出来るのかわかりませんが。 Aに1・2という情報?属性?を付けて Bに2・3を付けて Cに1を付けて 1が付いているのはA・C 2が付いているのはA・B 3が付いているのはB というように表示するにはどうすればいいでしょう?

    • 締切済み
    • XML
  • XMLを動的に読む

    ワードプレスなどで行われているPHP⇔MYSQLのような動きを、javascript⇔XMLでやりたいです。 具体的に言うと、 index.htmlでボタンAを押されるとdata.xmlのA情報がindex.htmlに表示される index.htmlでボタンBを押されるとdata.xmlのB情報がindex.htmlに表示される というものです。 Ajaxなど調べているのですが、なかなかいい情報が見つかりません。 てってきたいのはテキスト情報だけですので、なるべくシンプルで簡単なコードが知りたいのですが、複雑な部分が多くて困っています。 簡単なやり方が紹介されているサイトや簡単なサンプルを見せてもらえるととても助かります。

  • VB2005でXMLのテキストデータをXMLデータにするには?

    VB2005の初心者です。 タグ付きのXMLのテキストデータを読み込んで、項目ごとにDBに登録したいのですが、やり方が分りません。 テキストデータをXMLデータ、もしくはノード、もしくはデータセット型に変換しなければならないと思うのですが、そのやり方を教えていただきたいです。 ちなみに、XMLデータをテキストデータにするのは下記のとおりでできました。この strText を逆にXMLデータに変換したいです。 Dim xmlDoc As MSXML2.DOMDocument = New MSXML2.DOMDocument Dim strText As String xmlDoc.PreserveWhitespace = True xmlDoc.Load("C:XMLData.xml") strText = xmlDoc.xml 何かヒントでも良いので、たくさんの方の知恵をお借りしたいです。

  • 2つのxmlファイルを利用したリレーションシップ(?)に関して

    2つのxmlファイルを使用し、リレーションシップ(?)を作成してDataGridViewに表示させようとしているのですがうまくいきません。ご教授お願いいたします。 xmlファイル1: <タグ1> <タグ2 属性21="a1" 属性22="a2"></タグ2> <タグ2 属性21="b1" 属性22="b2"></タグ2> <タグ2 属性21="c1" 属性22="c2"></タグ2> </タグ1> xmlファイル2: <タグ1> <タグ2 属性21="a1" 属性22="d2"></タグ2> <タグ2 属性21="b1" 属性22="e2"></タグ2> <タグ2 属性21="c1" 属性22="f2"></タグ2> </タグ1> 表示させたい内容: | d2 | a2 | | e2 | b2 | | f2 | c2 |

  • 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のテキスト情報をHTMLに読み込みたい!

    XMLのテキスト情報をHTMLに読み込みたいのですが、 試行錯誤しておりまして;; 形的には、 <a href="ここに入れたい!"> という形でHTMLページ内に何箇所か使いたいのですが、 何かしら方法やヒントなど、 お教えいただける方、助けてくださいませ。。

    • ベストアンサー
    • 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
  • xmlの属性が重複しているのをxslで変換して表示するにはどうすればいいですか??

    xmlの属性が重複しているのをxslで変換して表示するにはどうすれば良いのでしょうか?? [ xml ] <content> <text>データ1</text> <text>データ2</text> </content> <content> <text>データ3</text> <text>データ4</text> </content> 上記のようなプログラムがあったとして、これを [html] <p>データ1</p> <p>データ2</p> <p>データ3</p> <p>データ4</p> という形で出力したいのですが、どのような xsl プログラムを書けばよいでしょうか?? xml ファイルの方は変更することができません。 ご教授よろしくお願いします。

    • ベストアンサー
    • XML
  • XML型に対する問い合わせ

    以下のような(1)と(2)のxml型を値を持つレコードがある場合にbの中でcとdが両方1の場合だけ検索((1)のレコードだけが欲しい)するようにはどのように問い合わせればば良いでしょうか? (1) <a>    <b><c>1</c><d>1</d></b>   </a> (2) <a>    <b><c>1</c><d>0</d></b>    <b><c>0</c><d>1</d></b>   </a> 自分で考えた問い合わせだと(1)と(2)の両方のレコードが返ってきてしまいます。 select * from test where   '1'=ANY(xpath('/a/b/c/text()',xml)::text[])   AND '1'=ANY(xpath('/a/b/d/text()',xml)::text[])

専門家に質問してみよう