C# 当xml文件包含xmlns时,XslCompiledTransform不起作用

C# 当xml文件包含xmlns时,XslCompiledTransform不起作用,c#,visual-studio-2010,xslt,xml-namespaces,C#,Visual Studio 2010,Xslt,Xml Namespaces,我有一个带有简单XSLT转换的简单XML文件,当我的XML文件中没有任何XMLN时,XslCompiledTransform做得很好,但是当我这样做时,生成的XML文件是空的-为什么 这是我的密码: public static void XmlToXmlWithXsl(string xmlFilePath, string xmlOutputFilePath, string xslFilePath) { // Load the style sheet.

我有一个带有简单XSLT转换的简单XML文件,当我的XML文件中没有任何XMLN时,XslCompiledTransform做得很好,但是当我这样做时,生成的XML文件是空的-为什么

这是我的密码:

    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的版本):


废话
波兰语
英语
废话
波兰语
英语
这是我的XSL(比以前小了一点):


输出为:

<?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>

废话
波兰语
英语
废话
波兰语
英语

这是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>


太好了,谢谢!对我来说非常奇怪,因为当输出方法是HTML时,它工作得很好……输入中元素的XPath选择和这些元素的XSLT匹配不会根据输出方法而改变,所以我不确定在使用output method=“HTML”时什么对您有效。
<?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>
<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>