2016-10-12 14 views
0

私はXSLTを時折行います。だから私はそれについて何かを理解していないかもしれない。XSLで<br>タグを閉じる必要があるのはなぜですか?

ない例が必要ですが、ここにあるかどうかを確認してください。 XMLは非常に簡単です:

<a></a> 

XSL:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html"/> 
    <xsl:template match="/"> 
    <xsl:apply-templates select="a"/> 
    </xsl:template> 
    <xsl:template match="a"> 
    <html> 
     <head> 
     <title>Title</title> 
     </head> 
     <body><br></body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

Javaコード:

public static String transform(String xml, String xsl) throws TransformerException { 

    StreamSource xslT = new StreamSource(new StringReader(xsl)); 

    TransformerFactory tFactory = TransformerFactory.newInstance(); 

    Transformer transformer = tFactory.newTransformer(xslT); 

    StreamSource source = new StreamSource(new StringReader(xml)); 

    StringWriter out = new StringWriter(); 
    StreamResult result = new StreamResult(out); 

    transformer.transform(source, result); 
    return out.toString(); 

} 

Iスタイルシートの出力タイプとしてhtmlを使用すると、有効なhtmlタグとして<br>を認識する必要があります。

一般的に...なぜhtmlの妥当性が気になるのですか?私は変数を宣言すればそれも気づいた。たとえば、

<xsl:variable name="someTable"> 
<table class="common" bgcolor="#DDDDDD"> 
</xsl:variable> 

同じエラーが報告されます。

私の目標は、無効なhtmlの作成ではありません。変数を宣言したいだけです(後で処理ロジックに応じて<table>を閉じます)。
これを回避する方法はありますか、出力タイプとしてtextを使用する必要がありますか。

答えて

3

出力方法がhtmlの場合、<br/><br>と出力されます。しかし、入力とスタイルシートの両方が整形式でなければなりませんXMLドキュメント。

変数に関するご質問は、開始タグのみを変数に格納することはできません。要素全体を格納する必要があります(この時点では、抽象化としてのみ存在し、タグはありません)。

は処理ロジックに応じて後で閉じる」という開始タグを保存する必要がある場合は、アプローチを再検討する必要があります。回避策を見つけることではありません。それはXSLTの仕組みではありません。

2

すべてのXSLTスタイルシートは、名前空間が整形式のXML文書であり、XMLでは</br>を持たない<br>は使用できません。 <br></br>ではなく、<br/>をXMLで使用できます。

+0

ああ。私はoutputメソッド= "html"オプションからあまり期待していないようです。だから、私は質問で言及したことをするために出力メソッド= "テキスト"を使わなければならないのですか? – ka3ak

+0

いいえ、絶対にありません。その直列化ではなく、ツリーに注目してください。 –

3

XSLTは、ソースツリーを結果ツリーに変換するための言語です。タグとマークアップを忘れる。彼らは表面的ではなく、あなたのスクリーンディスプレイにツリーを表示する便利な方法です。ソースドキュメントはツリー、スタイルシートはツリー、結果ドキュメントはツリーです。属性がなく、子がなく、名前が "br"である要素ノードは、XML表記では<br/>、HTML表記では<br>と表示されますが、XSLTでは違いはありません。

処理ロジックによっては[後でタグを閉じる]ことはできません。まず第一に、XSLTは関数型言語であり、処理の順序の概念がないため、「後で」の概念はありません。第2に、ツリー上のノードは分割不可能なオブジェクトであり、一度にすべてを作成します。別々の開始点と終了点を別々の時間に作成することはできません。

あなたがXSLTでこれを読んで:

<p> 
    <xsl:value-of select="XXXX"/> 
</p> 

あなたは(終了タグを書き込み、テキストの内容を書き込み、開始タグを書き込み)の3つの動作のシーケンスとしてそれを考えるかもしれません。しかし、これは正しい処理モデルではありません。このXSLTフラグメントには2つの要素ノード、p要素とxsl:value-of要素があります。したがって、結果ツリーにp要素を書き込むp命令と、結果ツリーにテキストノードを書き込むxsl:value-of命令があります。

関連する問題