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

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

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

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

XSLT

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

Q&A

1回答

461閲覧

<xsl:template match="p">の処理について教えてください。

UG_ito_Pcorp

総合スコア13

XML

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

XSLT

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

0グッド

0クリップ

投稿2023/04/14 01:45

<xsl:template match="">の仕組みが知りたい

<xsl:template match="p">の処理内に<p>要素のテキストを抽出する<xsl:value-of select="."/>を記述しなくても、以下のXSLTでは<p>要素のテキスト部分が抽出されます。
これはなぜ(どのような仕組み)か、ご説明いただけないでしょうか。

変換元ソース:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xml> <root> <p>回転数は1,000 min<span class="sup">-1</span>から2,000 min<span class="sup">-1</span>まで</p> </root>

変換XSLT:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/"> <topic> <title>character test</title> <body> <xsl:apply-templates/> </body> </topic> </xsl:template> <xsl:template match="root"> <xsl:apply-templates/> </xsl:template> ** <xsl:template match="p"> <p> <xsl:apply-templates/> </p> </xsl:template>** <xsl:template match="span[@class='sup']"> <sup><xsl:value-of select="."/></sup> </xsl:template> </xsl:stylesheet>

結果:

<?xml version="1.0" encoding="UTF-8"?> <topic> <title>character test</title> <body> <p>回転数は1,000 min<sup>-1</sup>から2,000 min<sup>-1</sup>。</p> </body> </topic>

この問題の前に、以下のXSLTでxsl:value-ofを指定すると、<p>要素のテキスト部分が重複して抽出される問題に行き当たりました。

変換元ソース:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xml> <root> <p>回転数は1,000 min<span class="sup">-1</span>以上</p> </root>

変換XSLT:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/"> <topic> <title>character test</title> <body> <xsl:apply-templates/> </body> </topic> </xsl:template> <xsl:template match="root"> <xsl:apply-templates/> </xsl:template> <xsl:template match="p"> <xsl:variable name="text" select="."/> <p> <xsl:value-of select="substring-before($text,span)"/> <xsl:apply-templates/> <xsl:value-of select="substring-after($text,span)"/> </p> </xsl:template> <xsl:template match="span[@class='sup']"> <sup><xsl:value-of select="."/></sup> </xsl:template> </xsl:stylesheet>

結果:

<?xml version="1.0" encoding="UTF-8"?> <topic> <title>character test</title> <body> **<p>回転数は1,000 min回転数は1,000 min<sup>-1</sup>以上以上</p>** </body> </topic>

試したこと

この問題は、ChatGPTに投げてみたところ<xsl:template match="p">処理内のxsl:apply-templates/を<xsl:apply-templates select="./span"/>に変更すればOK…とあったので、そのように変更したら希望する出力が得られましたが、ここでもなぜこれで解決するのか理解できていません。
初心者の域から脱せられず、何某で読んだ「要素matchは、node()とtext()を選択している…」が何に影響を及ぼすかも今イチ理解できません。これが関係しているのでしょうか。

何か共通して欠けている理解(知識)があるように思えます。
参考にすると良いサイトがあれば、そのご紹介でも結構です。
よろしくご教授のほど、お願いいたします。

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

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

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

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

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

guest

回答1

0

<xsl:apply-templates/> は、コンテキストノード(この場合は <p>)の子ノード(テキストも子要素も)それぞれに対してテンプレートを適用した結果をそこに埋め込みます。質問文の XSLT にはテキストノードに対するテンプレートがないため、デフォルトの動作としてテキストノードはそのまま埋め込まれます。

https://www.w3.org/TR/xslt-10/#built-in-rule

There is also a built-in template rule for text and attribute nodes that copies text through:

<xsl:template match="text()|@*"> <xsl:value-of select="."/> </xsl:template>

投稿2023/04/14 02:04

int32_t

総合スコア20909

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

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

UG_ito_Pcorp

2023/04/14 06:59

ご回答、ありがとうございました。 少し難解ですが、ご教授いただいたサイトの日本語訳に「明示したテンプレートルールが成功しない場合は、組込みテンプレートが適用される」…的なことが記述されており、int32_t サンの回答に「…デフォルトの動作としてテキストノードはそのまま埋め込まれます。」とありましたので、理解というよりは「そのまま記憶」させていただきます。教え甲斐の無い質問者で申し訳ありません。 何かありましたら、またよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問