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

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

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

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

XSLT

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

Q&A

2回答

1474閲覧

xmlとxslについて

ririri

総合スコア12

XML

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

XSLT

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

0グッド

1クリップ

投稿2019/05/23 06:14

xmlのテキストをタグを入れて順番通りにとりたいです。

xmlからhtmlに変換するにあたりxsltを使用して作っています。

以下のxmlからhtmlに変換しようと思っていますが。<mclMacro>タグと同列にある「1.1」のテキストがどうしてもとりだせません。
xmlを勉強し始めて間もないためいろいろな方法を試しましたができません。
xmlに詳しい方がいれば教えて頂けないでしょうか。

該当のソースコード

xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="3333333333.xsl" ?> <mc-smartx version="1.3"> <p>ああああ</p> <mclParag class="節数字" type="head-dannuki" level="0" ref-flg="false"> <mclMacro class="柱" content="start"> <ppp>aaaaaaa</ppp> </mclMacro> <mclMacro class="柱" content="start"> <ppp>aaaaaaa</ppp> </mclMacro> <mclMacro class="数" content="start"> <ccc>dddddddd</ccc> </mclMacro> <mcl>333</mcl> 1.1 </mclParag> <mclParag class="あああ"> <mcl>666</mcl> </mclParag> </mc-smartx>

該当のソースコード

xsl <?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" encoding="UTF-8" /> <xsl:template match="/"> <xsl:apply-templates select="mc-smartx"/> </xsl:template> <xsl:template match="mc-smartx"> <title><xsl:value-of select="p" /></title> <xsl:apply-templates select="mclParag[@class='節数字']"/> </xsl:template> <xsl:template match="mclParag[@class='節数字']"> <xsl:apply-templates select="mclMacro"/> <xsl:copy-of select="." /> </xsl:template> <xsl:template match="mclMacro"> <xsl:if test="@class='柱'"> <xsl:copy-of select="." /> </xsl:if> </xsl:template> </xsl:stylesheet>

実現したいテキスト順

aaaaaaa
aaaaaaa
1.1
という風に文字がとれればよいです。

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

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

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

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

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

guest

回答2

0

他の方の回答にもあるとおり、生成したいhtmlの構造が不明ですが、これだけ見てわかることをおしらせします。

下記のテンプレートにおいて、子要素のmclMacroにapply-templateしていることに加え、xsl:copy-ofで自分自身をコピーしているため、mclMacro[@class="柱"]の内容が重複して出力されてしまいます。

xsl

1<xsl:template match="mclParag[@class='節数字']"> 2 <xsl:apply-templates select="mclMacro"/> 3 <xsl:copy-of select="." /> 4</xsl:template>

「実現したいテキスト順」から推察するに、mclMacro[@class="数"]およびmclの出力は不要なので、xsl:copy-ofでの自身のコピーは不要でしょう。
そうなると今度はmclParag[@class="節数字"]直下のテキスト「1.1」が出力されなくなりますが、apply-templatesで、以下のようにmclMacroに加えテキストも指定してやればよいです。

xsl

1<xsl:apply-templates select="mclMacro|child::text()"/>

これで、mclMacroおよびchild::text()の処理を後続のテンプレートに渡すことができます。
なお、child::text()の処理は、特にご自身でマッチするテンプレートを書かない限り、組み込みテンプレートが行います。

すなわち、mclParag[@class='節数字']を処理するテンプレートを以下のようにします。

xsl

1<xsl:template match="mclParag[@class='節数字']"> 2 <xsl:apply-templates select="mclMacro|child::text()"/> 3</xsl:template>

これでとりあえず「aaaaaaa aaaaaaa 1.1」という文字列は生成されるようになります。
なお繰り返しますが、htmlの構造の可否はわかりません。

投稿2020/08/02 03:28

quwano

総合スコア6

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

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

0

XSLT get all nodes with text が関連していそうですね。
現状、ご質問にあります XSLT は HTML を生成しませんし、対象の HTML の構造が不明ですが、もし課題がより明瞭になりましたら、リンク先の回答を参考にできるかもしれません。

投稿2020/07/02 14:31

gemmaro

総合スコア358

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問