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

本文关键字:XslCompiledTransform 不起作用 xmlns xml 文件包 | 更新日期: 2023-09-27 18:09:01

我有一个简单的XML文件,简单的XSLT转换和XslCompiledTransform做得很好,当我没有任何xmlns在我的XML文件,但当我做的结果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):

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

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

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

相关文章:
  • 没有找到相关文章