2011-09-16 4 views
1

シンプルなXSLTトランスフォームの単純なXMLファイルがあり、XMLファイルにxmlnsが含まれていないとXslCompiledTransformがうまく機能します。空 - なぜですか?ここでxmlファイルにxmlnsが含まれているとXslCompiledTransformが機能しない

は私のコードです:ここでは

public static void XmlToXmlWithXsl(string xmlFilePath, string xmlOutputFilePath, string xslFilePath) 
    { 
     // Load the style sheet. 
     XslCompiledTransform xslt = new XslCompiledTransform(); 
     xslt.Load(xslFilePath); 

     // Create the writer. 
     XmlWriterSettings settings = xslt.OutputSettings; 
     XmlWriter writer = XmlWriter.Create(xmlOutputFilePath, settings); 

     // Execute the transformation. 
     xslt.Transform(xmlFilePath, writer); 
     writer.Close(); 
    } 

は私のXML(のxmlns付きバージョン)です:

<?xml version="1.0" encoding="utf-8"?> 
<messages xmlns="blah"> 
    <message> 
     <id>blah</id> 
     <text>Polski</text> 
     <text lang="en">English</text> 
     <notes /> 
    </message> 

    <message> 
     <id>blah2</id> 
     <text lang="pl">Polski</text> 
     <text lang="en">English</text> 
     <notes /> 
    </message> 
</messages> 
ここ

は私のXSLは、(それがし、その後少し小さい)である:

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

    <xsl:variable name="empty_string"></xsl:variable> 

    <!-- root --> 
    <xsl:template match="/"> 
     <xsl:element name="messages"> 
      <xsl:apply-templates select="//message" /> 
     </xsl:element> 
    </xsl:template> 

    <!-- AS-IS with xml content --> 
    <xsl:template match="message"> 
     <xsl:element name="{name(.)}"><xsl:apply-templates /></xsl:element> 
    </xsl:template> 

    <!-- AS-IS with text content --> 
    <xsl:template match="id|notes|text"> 
     <xsl:element name="{name(.)}"><xsl:value-of select="." /></xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

出力は次のとおりです。

<?xml version="1.0" encoding="utf-8"?> 
<messages xmlns="blablabla" /> 

出力は次のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<messages xmlns="blablabla"> 
    <message> 
     <id>blah</id> 
     <text>Polski</text> 
     <text>English</text> 
     <notes></notes> 
    </message> 
    <message> 
     <id>blah2</id> 
     <text>Polski</text> 
     <text>English</text> 
     <notes></notes> 
    </message> 
</messages> 

答えて

3

これは、XSLT/XPath 1.0のよくある質問です:特定の名前空間内の要素を選択するか、または一致するように、でも、デフォルトの名前空間、XSLT/XPath 1.0のとあなたがバインドする必要があります名前空間URIの接頭辞とパス式や試合のパターンでそのプレフィックスを使用するには、要素名を修飾します

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

<!-- root --> 
<xsl:template match="/"> 
    <xsl:element name="messages"> 
     <xsl:apply-templates select="//df:message" /> 
    </xsl:element> 
</xsl:template> 

<!-- AS-IS with xml content --> 
<xsl:template match="df:message"> 
    <xsl:element name="{name(.)}"><xsl:apply-templates /></xsl:element> 
</xsl:template> 

<!-- AS-IS with text content --> 
<xsl:template match="df:id|df:notes|df:text"> 
    <xsl:element name="{name(.)}"><xsl:value-of select="." /></xsl:element> 
</xsl:template> 

+1

グレート、ありがとう!出力方法が例えば次のような場合にはうまく動作するので、私にとっては非常に奇妙です。 HTML ... – Nux

+0

入力メソッドの要素のXPath選択とそれらの要素のXSLTのマッチングは出力メソッドによって変わりませんので、出力メソッド= "html"を使用するときには何が効果的かはわかりません。 –

関連する問題