2011-10-26 9 views
0

私は、入力XML文書が...XslCompiledTransformを使用して出力XMLに自己終了タグを取得するにはどうすればよいですか?

を助けてください。私は次のXMLにそれを変換する必要

<?xml version="1.0" encoding="utf-8"?> 
<Root> 
    <Object> 
     <GUID>201110180954525010129</GUID> 
     <Meta name="FILENAME" format="string" frate="" /> 
    </Object> 
</Root> 

を:

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <Object> 
     <GUID>201110180954525010129</GUID> 
     <FILENAME/> 
    </Object> 
<Root> 

私は次のスタイルシートを作成しました:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/"> 
<xsl:element name="Root"> 

<xsl:for-each select="Root/Object"> 
<xsl:element name="Object"> 

<xsl:element name="FILENAME"> 
     <xsl:value-of select="Meta[@name='FILENAME']" /> 
</xsl:element> 

<xsl:element name="GUID"> 
     <xsl:value-of select="GUID" /> 
</xsl:element> 

</xsl:element> 
</xsl:for-each> 

</xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

しかし、変換しようとすると、n拡張結果:

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <Object> 
    <GUID>201110180954525010129</GUID> 
     <FILENAME> </FILENAME> 
    </MAObject> 
<Root> 

セルフクローズタグの解釈方法を教えてください。

C#の変換コード:

 var stylesheet = "styleSheet.xml"; 
     XmlDocument xmlDocument = new XmlDocument(); 
     xmlDocument.Load("input.xml"); 
     XslCompiledTransform xslTransform = new XslCompiledTransform(); 
     xslTransform.Load(styleSheet); 

      XmlDocument xmlDocumentOutput = new XmlDocument(); 
      XmlDeclaration xmlDocumentOutputDeclaration = xmlDocumentOutput.CreateXmlDeclaration("1.0", "utf-8", null); 
      xmlDocumentOutput.AppendChild(xmlDocumentOutputDeclaration); 

      using (XmlWriter xmlWriter = xmlDocumentOutput.CreateNavigator().AppendChild()) 
      { 
       xslTransform.Transform(xmlDocument.CreateNavigator(), null, xmlWriter); 
      } 

      return xmlDocumentOutput; 

答えて

0

に私はXslCompiledTransformではと私たちのサンプルを試してみました、私が手出力は

<Root> 
    <Object> 
    <FILENAME></FILENAME> 
    <GUID>201110180954525010129</GUID> 
    </Object> 
</Root> 

あなたは正確に変換を実行するにはどうすればよい、どのように出力を見ないのですか? XMLでは空の "foo"要素は<foo></foo>または<foo/>または<foo />とマークアップできますが、これらの形式は意味的に同等です。なぜあなたは特定のフォームが必要ですか? XSLT変換の出力はXMLパーサーによって処理されませんか?

[編集]

<FILENAME> 
    <xsl:if test="normalize-space(Meta[@name='FILENAME'])"> 
    <xsl:value-of select="Meta[@name='FILENAME']"/> 
    </xsl:if> 
</FILENAME> 

<xsl:element name="FILENAME"> 
     <xsl:value-of select="Meta[@name='FILENAME']" /> 
</xsl:element> 

を交換するかどうかを試してみてくださいは、少なくともあなたが得るFILENAME要素が空であることを保証します。

+0

こんにちは!答えをありがとう。私はちょうど質問を更新しました...タグ間に空白が表示される理由はわかりません。

0

FILENAMEに一致するテンプレートの<xsl:value-of>の改行(およびその他の空白)を削除してみてください。それらは結果に現れるテキストノードです。

0

違いが出るかどうかわかりませんが、Metaのデータがある場合とない場合のテンプレートが別々になっているこのスタイルシートを試してみてください。

<Root> 
    <Object> 
     <GUID>201110180954525010129</GUID> 
     <FILENAME/> 
    </Object> 
</Root> 
:何もない場合、私がこれをテストするとき、私は次のような結果を得るアイデンティティテンプレート上に構築されたので、元のXSLTにハードコーディング非常に多くの要素名の必要性を取り除く

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

    <xsl:template match="Meta"> 
     <xsl:element name="{@name}" /> 
    </xsl:template> 

    <xsl:template match="Meta[. != '']"> 
     <xsl:element name="{@name}"> 
     <xsl:apply-templates select="node()"/> 
     </xsl:element> 
    </xsl:template> 

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

されます

関連する問題