5

一部の xml を次の形式の HTML に変換したい:

<TR><TD> 列1 <TD> 列 2 <TD> 列 3 </TR>

注:出力はHTMLであり、オプションの終了タグは省略されています。これが問題であり、質問が存在する理由です。

私が使用している XSL のスニペットは次のとおりです。

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output 
    doctype-system='http://www.w3.org/TR/html4/strict.dtd'
    doctype-public='-//W3C//DTD HTML 4.01//EN'
    indent='yes'
    method='html'
    />
   ...
   <xsl:for-each select="/">  
      <TR><TD><xsl:value-of select="col1"/><TD><xsl:value-of select="col2"/><TD><xsl:value-of select="col3"/></TR>
   </xsl:for-each>

XSL の内容が目的の HTML と一致することがわかります (読みやすいようにラップされています)。

<TR>  <TD><xsl:value-of select="Column1"/>
      <TD><xsl:value-of select="Column2"/>
      <TD><xsl:value-of select="Column3"/> </TR>

注: XSLT から得られるエラーを知っている人は、答えを知っていることを願っています。

XSLmy (これは の形式であることを忘れないでください) を提示すると、xml整形式でないエラーが発生します。

終了タグ「TR」が開始タグ「TD」と一致しません。

これは完全に理にかなっています。それはそう:

<TD><xsl:value-of select="Column3"/> </TR>

TDを閉じる前に要素を閉じませんTR。質問は次のとおりです。

ではない場合、どうすればxmlに変身できますか?HTMLHTMLxml

こちらもご覧ください


1つ更新

XSL を有効にするために、単純に終了タグを含めることも提案されています (読みやすいように折り返されています)。

<TR>    <TD><xsl:value-of select="col1"/></TD>
        <TD><xsl:value-of select="col2"/></TD>
        <TD><xsl:value-of select="col3"/></TD>   </TR>

次に、 を使用するxsl:output method='html'と、最終的な HTML コンテンツで</TD>タグが魔法のように省略されます。動作しないことを除いて:

<TR><TD>col1</TD><TD>col2</TD><TD>col3</TD></TR>

2つ更新

私はあきらめて、わざわざこの質問をするのではなく、オプションの終了タグだけを含めることをお勧めします。それは可能ですが、それは私の質問ではありません。また、「解決策」は、終了タグが禁止されている要素では機能しません。例:

<BR/>

また

<BR></BR>

HTML では要素を閉じることが禁止さ<BR>れているため、HTML 出力に要素を含める方法を教えてください。<BR>

4

4 に答える 4

2

これを行う1つの方法は次のとおりです。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/*">
   &lt;TR>&lt;TD><xsl:value-of select="col1"/>&lt;TD><xsl:value-of select="col2"/>&lt;TD><xsl:value-of select="col3"/>&lt;/TR>
 </xsl:template>
</xsl:stylesheet>

この変換が次のXMLドキュメントに適用される場合

<t>
 <col1>1</col1>
 <col2>2</col2>
 <col3>3</col3>
</t>

必要な結果が正しく生成されます。

   <TR><TD>1<TD>2<TD>3</TR>
于 2010-06-30T01:57:14.893 に答える
2

最も簡単なことは、出力に終了タグが含まれることを受け入れることだと思います。それらはオプションかもしれませんが、ほとんどの人は、ベストプラクティスがそれらを含めることであることに同意すると思います。

出力にオプションの終了タグが本当に必要ない理由はありますか?

2つ更新

このアップデートには問題はありません。Withmethod="html" <BR/>は次のように出力され<BR>ます:

XSLT(注<BR/>):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output 
doctype-system='http://www.w3.org/TR/html4/strict.dtd'
doctype-public='-//W3C//DTD HTML 4.01//EN'
indent='yes'
method='html'
/>

<xsl:template match="/">
<HTML><BODY>
    <TR>
        <xsl:apply-templates/>
    </TR>
    <BR/> <!-- HERE -->
</BODY></HTML>
</xsl:template>

<xsl:template match="item">
    <TD><xsl:value-of select="."/></TD>
</xsl:template>

</xsl:stylesheet>

入力:

<root>
<item>one</item>
<item>two</item>
</root>

出力(注<BR>):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<HTML><BODY>
<TR>
<TD>one</TD>
<TD>two</TD>
</TR>
<BR> <!-- HERE -->
</BODY></HTML>
于 2010-06-30T01:41:23.527 に答える
1

「HTML」として出力を試しましたか?HTMLで自己閉じてはならない要素は、そうではありません(つまり<BR><img>)。

XSLTエンジンがHTML出力をシリアル化する方法がまだ気に入らない場合は、を設定して、必要な「HTML」を作成できます<xsl:output method="text">

&lt;TR>&lt;TD><xsl:value-of select="col1"/>&lt;TD><xsl:value-of select="col2"/>&lt;TD><xsl:value-of select="col3"/>&lt;/TR>

これは以下を生成します:

<TR><TD>col1<TD>col2<TD>col3</TR>  
于 2010-06-30T01:41:08.953 に答える
0

イアン、試した<xsl:output method="text">

http://www.w3schools.com/xsl/el_output.asp

于 2010-06-30T01:30:31.193 に答える