teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

ブラウザで閲覧するための説明を追加

2020/07/26 23:24

投稿

gemmaro
gemmaro

スコア358

answer CHANGED
@@ -10,6 +10,8 @@
10
10
 
11
11
  上記の点について修正したものが以下です。
12
12
 
13
+ 註記:当初 XSLT ファイル名に関する XML ファイルからのリンクによる制約を見落として `main.xsl` としていましたが、ブラウザから表示してみる場合などでは `xslt.xsl` としなければ正しい表示が得られません。
14
+
13
15
  ファイル構造:
14
16
 
15
17
  ```
@@ -50,11 +52,40 @@
50
52
  </xsl:stylesheet>
51
53
  ```
52
54
 
53
- 実行
55
+ ## 実行
54
56
 
57
+ ### コマンドライン
58
+
55
59
  ```
56
60
  $ xsltproc main.xsl index.xml
57
61
  <HTML><BODY>姉</BODY></HTML>
58
62
  ```
59
63
 
60
- `test` 属性値が真の内容のみ実行されていることがわかります。
64
+ `test` 属性値が真の内容のみ実行されていることがわかります。
65
+
66
+ ### ブラウザ
67
+
68
+ ブラウザで確認する場合、単に XML ファイルを開いても意図通りに表示されない可能性があります。
69
+ 例えば Firefox ですと、`クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、file:///Users/gemmaro/***/xslt.xsl にあるリモートリソースの読み込みは拒否されます (理由: CORS 要求が http でない)。` というエラーが Firefox のコンソールに表示されてしまいます。localhost で見てみることにしましょう。
70
+ XML ファイルなどがあるディレクトリで
71
+
72
+ ```
73
+ $ ruby -run -e httpd . -p 8000
74
+ ```
75
+
76
+ として
77
+
78
+ ```
79
+ [2020-07-27 08:01:51] INFO WEBrick 1.6.0
80
+ [2020-07-27 08:01:51] INFO ruby 2.7.1 (2020-03-31) [x86_64-darwin19]
81
+ [2020-07-27 08:01:51] INFO WEBrick::HTTPServer#start: pid=4410 port=8000
82
+ ```
83
+
84
+ このようにログが出て来始めたら OK です。
85
+ Firefox にて `localhost:8000/index.xml` を開いてみましょう。
86
+
87
+ するとまだエラーになります。
88
+
89
+ ![エラー画面](e40aa91f687b454f9faa139128d3b39d.png)
90
+
91
+ このエラーの意味は取れないのですが、`xslt.xsl` というファイルを用意した覚えはないので、XML から XSLT ファイルへのリンクに見合った XSLT のファイル名ではなかったということに気が付きます。`main.xsl` としていたものを `xslt.xsl` としてブラウザを再読込すれば意図通りの表示を得ます。

1

実例を追加

2020/07/26 23:24

投稿

gemmaro
gemmaro

スコア358

answer CHANGED
@@ -1,7 +1,60 @@
1
- いくつかの修正点が提案されます:
1
+ # 修正点
2
2
 
3
3
  * XML と XSLT とで要素名が異なる:`家族` と `family` -> ここでは後者に統一
4
4
  * typo: XSLT の URI について `Trasform` -> `Transform`
5
5
  * `xsl:when` の `test` 属性値で `<` は使えません。参考: [W3C による XPath 1.0](https://www.w3.org/TR/1999/REC-xpath-19991116/) の `/html/body/blockquote[5]`
6
6
  * 閉じタグの位置の前後:`</BODY></HTML>` の出現位置。`xsl:template` の外に出ています
7
- * その他の簡略化:`<xsl:template match="/">...` をなくす。`<xsl:template match="family">...` だけで充分です
7
+ * その他の簡略化:`<xsl:template match="/">...` をなくす。`<xsl:template match="family">...` だけで充分です
8
+
9
+ # 実例
10
+
11
+ 上記の点について修正したものが以下です。
12
+
13
+ ファイル構造:
14
+
15
+ ```
16
+ $ exa
17
+ index.xml main.xsl
18
+ ```
19
+
20
+ `index.xml`:
21
+
22
+ ```xml
23
+ <?xml version="1.0" encoding="UTF-8"?>
24
+ <?xml-stylesheet type="text/xsl" href="xslt.xsl"?>
25
+ <family>
26
+ <brother>兄</brother>
27
+ <sister>姉</sister>
28
+ </family>
29
+ ```
30
+
31
+ `main.xsl`:
32
+
33
+ ```xsl
34
+ <?xml version="1.0" encoding="UTF-8"?>
35
+ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
36
+ <xsl:template match="family">
37
+ <HTML>
38
+ <BODY>
39
+ <xsl:choose>
40
+ <xsl:when test="5 > 2">
41
+ <xsl:value-of select="sister"/>
42
+ </xsl:when>
43
+ <xsl:when test="5 &lt; 2">
44
+ <xsl:value-of select="brother"/>
45
+ </xsl:when>
46
+ </xsl:choose>
47
+ </BODY>
48
+ </HTML>
49
+ </xsl:template>
50
+ </xsl:stylesheet>
51
+ ```
52
+
53
+ 実行:
54
+
55
+ ```
56
+ $ xsltproc main.xsl index.xml
57
+ <HTML><BODY>姉</BODY></HTML>
58
+ ```
59
+
60
+ `test` 属性値が真の内容のみ実行されていることがわかります。