2010-12-10 17 views
4

私はXSLTテンプレートを使用してHTMLにXMLを変換するために、このコードを使用します。なぜXslCompiledTransformはHTML出力にMETAタグを追加しますか?

string uri = Server.MapPath("~/template.xslt"); 
XslCompiledTransform xsl = new XslCompiledTransform(); 
xsl.Load(uri); 
XDocument xml = new XDocument(new XElement("Root")); 
StringBuilder builder = new StringBuilder(); 
XmlReader reader = xml.CreateReader(); 
XmlWriter writer = XmlWriter.Create(builder, xsl.OutputSettings); 
xsl.Transform(reader, writer); 
writer.Close(); 

私のテンプレートは次のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
<xsl:output method="html" indent="yes" /> 
<xsl:template match="Root"> 
    <html> 
     <head>... 

出力は、しかし、それはMETAタグを含む正しいです。どのようにMETAタグを生成しないように変換を無効にするには?

答えて

4

出力メソッド= "html"(http://www.w3.org/TR/xslt#section-HTML-Output-Method)のXSLT 1.0仕様では、頭部がある場合にメタ要素が出力されることが要求されています結果ツリー内のセクション:

HEAD要素がある場合、 html出力メソッドはすぐに実際に使用される文字エンコーディング を指定HEAD要素 の 開始タグの後にMETA 要素を追加する必要があります。

XslCompiledTransformは、XSLTプロセッサが何をすべきかを行います。 meta要素を必要としない場合は、正確にどのような出力を必要としているのか、html出力が必要な場合にメタが問題になるのかを詳しく説明する必要があります。もちろん、出力メソッド= "xml"を使うこともできます。そうすれば、meta要素は得られませんが、そのようなシリアライゼーション結果が、 'br'要素ノードのようなものになります。

+0

1より高速な答えをXML名前空間を追加したい場合。 [HTML互換性ガイドライン](http://www.w3.org/TR/xhtml1/#guidelines) –

+2

に続くxup出力XHTML文書のための 'xml'シリアライズメソッドを使用することが可能です.HTML出力には終了タグ。私は、XHTMLが正しく閉じたタグを持っていると思います。 – jlp

5

短い答え

使用は:

<xsl:output method="xml"/> 

これは、任意の追加のHTMLタグが<meta>としてsuschなくなります。

同時に、一部の要素の正確な字句表現を実現するのが難しい場合があります。 XSLT 2.0で

1はを使用することができます。

<xsl:output method="xhtml"/> 
1

それはまた、あなたの出力タグから挿入するのdoctypeに依存します。たとえば、XHTMLを使用すると、METAタグは省略されます。

<xsl:output method="html" 
       doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" 
       doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/> 
0

あなたはMATEのタグを追加することなく、HTML出力がちょうどhtmlタグで

このような
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
関連する問題