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

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

ただいまの
回答率

88.78%

xmlとxslについて

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 544

ririri

score 12

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
という風に文字がとれればよいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

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

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


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

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


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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る