2

現在、作業中のXML/XSLTからHTMLへの変換で問題が発生しています。つまり、XMLタグ内でタグを使用<br />して、変換後のHTMLファイルに改行が表示されるようにします。何度か試した後、それを機能させることができましたが、他の機能が犠牲になりました。つまり、パーツを強調表示する機能。

まず、ダンプされたXMLファイル。したがって、基本的に、すべてに名前と名前が含まれる可能性のあるタグがいくつかあります。この場合、名前と名前を別の行で解析する必要があります(したがって<br />タグ)。さらに、場合によっては、名または姓を強調表示する必要があります。この場合、3行目で、姓は「TheHand」です。

<swift_native>
<tag tag_code=":1:"><![CDATA[Jaco<br />Ronnie]]></tag>
<tag tag_code=":2:"><![CDATA[John<br />Doe]]></tag>
<tag tag_code=":2:"><![CDATA[Robbie<br />]]><highlight>The Hand</highlight></tag>
</swift_native>

これまでのところ、XSLT内で使用する方法に応じて、改行を正しく取得するか、強調表示することができます。ただし、両方ではありません。次の図はこれを示しています。

出力 以下に、使用されているXSLTファイルを示します。使用<xsl:apply-templates/>するとハイライトが機能し、正しく<xsl:value-of select="." disable-output-escaping="yes"/>使用できるようになります。<br />

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- HTML Layout definition -->
<xsl:output method="html"/>
<xsl:template match="swift_native">

    <html>
        <head>
            <title>
                <xsl:apply-templates select="message_id"/>
            </title>
            <style type="text/css">
                #tbl1,#tbl2 {display:none;}
                #lnk1,#lnk2   {border:none;background:none;width:85px;}
                td {FONT-SIZE: 75%; MARGIN: 0px; COLOR: #000000;}
                td {FONT-FAMILY: verdana,helvetica,arial,sans-serif}
                a {TEXT-DECORATION: none;}
                table.subtable {border-collapse:collapse;}
                table.subtable td {border:1px solid black;}
            </style>
        </head>
        <body>
            <table cellpadding="3" width="100%" class="subtable">
                <tr bgcolor="#cccccc">
                    <td colspan="3">Block4</td>
                </tr>
                <xsl:apply-templates select="tag" />
            </table>
        </body>
    </html>
</xsl:template>

<!-- Variable definition -->

<xsl:template match="tag">
    <tr>
        <td>
            <b>
                <xsl:value-of select="@tag_code" />
            </b>
        </td>
        <td>
            <xsl:value-of select="." disable-output-escaping="yes"/>
        </td>
        <td>
            <xsl:apply-templates/>
        </td>
    </tr>
</xsl:template>

<xsl:template match="highlight">
    <span style="background-color:yellow;">
        <xsl:apply-templates/>
    </span>
</xsl:template>

</xsl:stylesheet>

<br />明らかに、問題は、タグとハイライトの両方を使用できる方法を誰かが知っているかどうかです。

4

4 に答える 4

2

CDATAコンテンツをマークアップではなくプレーンテキストとして解釈するようにプロセッサに指示しています。そのため、が として表示されdisable-output-escapingないようにする必要があります。<br/>&lt;br/&gt;

を利用したい場合はdisable-output-escaping、タグの内容に対して選択する方法を分割する必要があります。

テンプレートを追加する

<xsl:template match="tag/text()">
    <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>

value-of行を次のように変更します

<xsl:apply-templates select="text()|*"/>
于 2013-01-28T17:44:24.923 に答える
1

ここでの1つの解決策は、両方を使用することです。

<xsl:template match="tag">
    <tr>
        <td>
            <b>
                <xsl:value-of select="@tag_code" />
            </b>
        </td>
        <td>
            <xsl:apply-templates/>
        </td>
    </tr>
</xsl:template>

<xsl:template match="tag//text()">
    <xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>

<xsl:template match="highlight">
    <span style="background-color:yellow;">
        <xsl:apply-templates />
    </span>
</xsl:template>

ただし、これを行う場合は、<tag>ノード内のテキスト値がCDATA内で適切にエスケープされ、ノード外で二重にエスケープされていることを確認する必要があることに注意してください。

<tag tag_code=":2:"><![CDATA[Robbie & Bobbie <br />]]><highlight> &amp; The Hand</highlight></tag>

あなたが持っている必要があります:

<tag tag_code=":2:"><![CDATA[Robbie &amp; Bobbie<br />]]><highlight> &amp;amp; The Hand</highlight></tag>

したがって、<tag>要素にXML特殊文字が含まれる可能性がある場合、これはおそらく優れたアプローチではありません。

のすぐ下のテキスト<tag>常にCDATAに含まれ、下位ノード(<highlight>sなど)に含まれないことを確認できる場合は、やや単純です。上記のテキスト一致テンプレートを次のテンプレートに置き換えることができます。

<xsl:template match="tag/text()">
    <xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>

次に、CDATA内のものが適切にエスケープされていること、およびその他のものが有効なXMLであることを確認する必要があります。

最後に、ソースデータをある程度制御できる場合は、CDATAを破棄して、 :に<br />権利を持たせることを検討する必要があります。<tag>

<tag tag_code=":2:">Robbie<br /><highlight>The Hand</highlight></tag>

次に、このXSLを使用できます。これは、以下を使用するものよりもはるかに堅牢ですdisable-output-escaping

<xsl:template match="tag">
    <tr>
        <td>
            <b>
                <xsl:value-of select="@tag_code" />
            </b>
        </td>
        <td>
            <xsl:apply-templates/>
        </td>
    </tr>
</xsl:template>

<xsl:template match="tag/@* | tag/node()">
   <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
   </xsl:copy>
</xsl:template>

<xsl:template match="highlight">
    <span style="background-color:yellow;">
        <xsl:apply-templates />
    </span>
</xsl:template>
于 2013-01-28T17:48:49.173 に答える
1

幸いなことに、簡単な解決策もあります。次の行を xsl ファイルに追加するだけです。

<xsl:template match="br"><br/></xsl:template>  

このように、データを CDATA にラップする必要はありませんが、代わりに、より直感的な方法を使用してください。

<tag tag_code=":1:">Jaco<br/>Ronnie</tag>

同様に、他の一般的な単純な HTML タグを含めることもできます。太字、斜体などを CSS スタイルにリンクする例を次に示しますが、それぞれのワンライナー (上記のような) も機能します。

<xsl:template match="i|b|u|strong">
    <span>
        <xsl:attribute name="class">html_<xsl:value-of select="name(.)" /></xsl:attribute>
        <xsl:apply-templates />
    </span>
</xsl:template>

これを頻繁に行う場合は、それらをすべて html.xsl にコピーしxsl:include、必要に応じて使用してください。

于 2017-01-04T20:39:01.737 に答える