質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

XSLT

XSLTは、組み立てられた文書を(XML、HTML、そしてプレーンテキストのような)別のフォーマットに変化する為にデザインされたXMLの為の変換用言語です。

Q&A

1回答

663閲覧

xmlとxsltを用いて条件判断処理を実現させたい

zuttonetetai

総合スコア1

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

XSLT

XSLTは、組み立てられた文書を(XML、HTML、そしてプレーンテキストのような)別のフォーマットに変化する為にデザインされたXMLの為の変換用言語です。

0グッド

0クリップ

投稿2020/07/25 17:32

編集2020/07/26 09:38

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<?xml-stylesheet type="text/xsl" href="xslt.xsl"?> 3<家族> 4 <brother></brother> 5 <sister></sister> 6</家族>

xslt

1<?xml version="1.0" encoding="UTF-8"?> 2<xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/XSL/Trasform"> 4 5<xsl:template match="/"> 6 <xsl:apply-template/> 7</xsl:template> 8<xsl:template match="family"> 9 <HTML> 10 <BODY> 11 <xsl:choose> 12 <xsl:when test="5>2"> 13 <xsl:value-of select="sister"/> 14 </xsl:when> 15 <xsl:when test="5<2"> 16 <xsl:value-of select="brother"/> 17 </xsl:when> 18 </xsl:choose> 19</xsl:template> 20</xsl:stylesheet> 21</BODY> 22</HTML>

皆さま、初めまして。XMLとXSLTを学び始めたのですがうまく条件判断の処理ができません。
これらのXMLとXSLTを使ってHTMLに変換はできたのですが、条件判断の処理がうまく機能せずに、兄と姉をただ単にHTMLに変換して表示させてしまいます。
実際には兄は表示させずに姉だけを表示させたいのですが、条件判断処理を使いながらですと、どのように改善をすれば実現することはできるのでしょうか?是非御教授のほどよろしくお願い致します。

追記

xslt

1<?xml version="1.0" encoding="UTF-8"?> 2<xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 4 5<xsl:template match="family"> 6 <HTML> 7 <BODY> 8 <xsl:choose> 9 <xsl:when select="5>2"> 10 <xsl:value-of select="brother"/> 11 </xsl:when> 12 <xsl:when select="5<2"> 13 <xsl:value-of select="sister"/> 14 </xsl:when> 15 </xsl:choose> 16</BODY> 17</HTML> 18</xsl:template> 19</xsl:stylesheet>

ご指摘いただいたところを改善したつもりですが、結果が変わりません
どうすればよろしいのですしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

修正点

  • XML と XSLT とで要素名が異なる:家族family -> ここでは後者に統一
  • typo: XSLT の URI について Trasform -> Transform
  • xsl:whentest 属性値で < は使えません。参考: W3C による XPath 1.0/html/body/blockquote[5]
  • 閉じタグの位置の前後:</BODY></HTML> の出現位置。xsl:template の外に出ています
  • その他の簡略化:<xsl:template match="/">... をなくす。<xsl:template match="family">... だけで充分です

実例

上記の点について修正したものが以下です。

註記:当初 XSLT ファイル名に関する XML ファイルからのリンクによる制約を見落として main.xsl としていましたが、ブラウザから表示してみる場合などでは xslt.xsl としなければ正しい表示が得られません。

ファイル構造:

$ exa index.xml main.xsl

index.xml:

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<?xml-stylesheet type="text/xsl" href="xslt.xsl"?> 3<family> 4 <brother></brother> 5 <sister></sister> 6</family>

main.xsl:

xsl

1<?xml version="1.0" encoding="UTF-8"?> 2<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 3 <xsl:template match="family"> 4 <HTML> 5 <BODY> 6 <xsl:choose> 7 <xsl:when test="5 > 2"> 8 <xsl:value-of select="sister"/> 9 </xsl:when> 10 <xsl:when test="5 &lt; 2"> 11 <xsl:value-of select="brother"/> 12 </xsl:when> 13 </xsl:choose> 14 </BODY> 15 </HTML> 16 </xsl:template> 17</xsl:stylesheet>

実行

コマンドライン

$ xsltproc main.xsl index.xml <HTML><BODY>姉</BODY></HTML>

test 属性値が真の内容のみ実行されていることがわかります。

ブラウザ

ブラウザで確認する場合、単に XML ファイルを開いても意図通りに表示されない可能性があります。
例えば Firefox ですと、クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、file:///Users/gemmaro/***/xslt.xsl にあるリモートリソースの読み込みは拒否されます (理由: CORS 要求が http でない)。 というエラーが Firefox のコンソールに表示されてしまいます。localhost で見てみることにしましょう。
XML ファイルなどがあるディレクトリで

$ ruby -run -e httpd . -p 8000

として

[2020-07-27 08:01:51] INFO WEBrick 1.6.0 [2020-07-27 08:01:51] INFO ruby 2.7.1 (2020-03-31) [x86_64-darwin19] [2020-07-27 08:01:51] INFO WEBrick::HTTPServer#start: pid=4410 port=8000

このようにログが出て来始めたら OK です。
Firefox にて localhost:8000/index.xml を開いてみましょう。

するとまだエラーになります。

エラー画面

このエラーの意味は取れないのですが、xslt.xsl というファイルを用意した覚えはないので、XML から XSLT ファイルへのリンクに見合った XSLT のファイル名ではなかったということに気が付きます。main.xsl としていたものを xslt.xsl としてブラウザを再読込すれば意図通りの表示を得ます。

投稿2020/07/26 00:12

編集2020/07/26 23:24
gemmaro

総合スコア358

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zuttonetetai

2020/07/26 09:37

gemmero様 ご回答ありがとうございます ご指摘いただいた箇所を改善したつもりですが、結果が変わりませんでした。 ご参考用にいただきましたW3CのWebページは大変お恥ずかしながら学がなく読むことができませんでした。大変申し訳ありません test属性値のところが何属性値に変えたらいいのか是非御教授お願い致します。
gemmaro

2020/07/26 10:05

回答に実例を加えました。 先に示したリンクから引用すると、"When an XPath expression occurs in an XML document, any < and <= operators must be quoted according to XML 1.0 rules by using, for example, &lt; and &lt;=." とあります。 したがって今回の場合、 `5 < 2` と書きたいのですが、 `5 &lt; 2` とする必要があります。
zuttonetetai

2020/07/26 15:25

gemmaro 様たびたびご回答ありがとうございます。 実例でいただいたサンプルindex.xmlとmain.xslをコピペして保存し、index.xmlのhref部分を"main.xsl"としてfire foxとieで実行して見たのですが、兄と姉両方とも表示されてしまいました。 私の実行環境がおかしいのでしょうか?
gemmaro

2020/07/26 23:26

原因は2つ考えられます。1つ目はローカルサーバを立てること、もう1つは XML ファイルからのリンクに見合ったファイル名に修正することです。この点について回答に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問