C# 如何让XslCompiledTransform在根元素中包含xmlns?

C# 如何让XslCompiledTransform在根元素中包含xmlns?,c#,xml,xslt,xslcompiledtransform,C#,Xml,Xslt,Xslcompiledtransform,我试图使用XslCompiledTransform C#类将一个xml文件转换为另一个xml文件。但是,没有传输xmlns属性 我的代码: XmlReader reader = XmlReader.Create("machine1.xml"); XmlWriter writer = XmlWriter.Create("machine2.xml"); XslCompiledTransform transform = new XslCompiledTransform(); transform.Lo

我试图使用XslCompiledTransform C#类将一个xml文件转换为另一个xml文件。但是,没有传输xmlns属性

我的代码:

XmlReader reader = XmlReader.Create("machine1.xml");
XmlWriter writer = XmlWriter.Create("machine2.xml");

XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("transform.xsl");

transform.Transform(reader, writer);
XSLT:


输入:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMachine xmlns="http://schemas.datacontract.org/2004/07/CMachines" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Machine>
      <Name>DellM7600</Name>
      <ID>1</ID>
      <Type>Laptop</Type>
      <Disabled>false</Disabled>
      <SerialNum>47280420</SerialNum>
    </Machine>
    <Machine>
      <Name>DellD600</Name>
      <ID>2</ID>
      <Type>Laptop</Type>
      <Disabled>false</Disabled>
      <SerialNum>53338123</SerialNum>
    </Machine>
    </ArrayOfMachine>

德尔姆7600
1.
笔记本电脑
假的
47280420
德尔尔德600
2.
笔记本电脑
假的
53338123
这是实际输出:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMachine xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/CMachines" >
    <Machine>
      <Name>DellM7600</Name>
      <ID>1</ID>
      <Type>Laptop</Type>
      <Disabled>false</Disabled>
      <SerialNum>47280420</SerialNum>
    </Machine>
    <Machine>
      <Name>DellD600</Name>
      <ID>2</ID>
      <Type>Laptop</Type>
      <Disabled>false</Disabled>
      <SerialNum>53338123</SerialNum>
    </Machine>
    </ArrayOfMachine>

德尔姆7600
1.
笔记本电脑
假的
47280420
德尔尔德600
2.
笔记本电脑
假的
53338123
这是所需的输出:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMachine xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/CMachines" >
    <Machine>
      <Name>DellM7600</Name>
      <ID>1</ID>
      <Type>Laptop</Type>
      <SerialNum>47280420</SerialNum>
    </Machine>
    <Machine>
      <Name>DellD600</Name>
      <ID>2</ID>
      <Type>Laptop</Type>
      <SerialNum>53338123</SerialNum>
    </Machine>
    </ArrayOfMachine>

德尔姆7600
1.
笔记本电脑
47280420
德尔尔德600
2.
笔记本电脑
53338123

您以前尝试在XSLT中使用
xpath默认名称空间
,XSLT 1.0不支持该名称空间

相反,您需要使用绑定到XML中指定的名称空间的名称空间前缀来匹配该名称空间中的
禁用的
元素

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:cm="http://schemas.datacontract.org/2004/07/CMachines" 
                              xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <!-- Copy everything not subject to the exceptions below -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
  <!-- Ignore the disabled element -->
  <xsl:template match="cm:Disabled" />
</xsl:stylesheet>


注意,只要名称空间URI匹配,使用的名称空间前缀是任意的。

您的xml格式不正确。这真的是你得到的结果吗?C#中的XsltCompiledTrasnform是XSLT1.0处理器,因此不支持
xpath默认名称空间
,因此不应应用模板匹配
禁用
。@AjeetSingh这是一个复制/粘贴问题。@TimC是的,我在疯狂的编辑中迷失了方向。上面发布的内容就是我所拥有的,但不幸的是,它只是将源输出复制到目标输出,正如您所描述的那样。我做错了什么?我以前做过这个。
<xsl:stylesheet version="1.0" xmlns:cm="http://schemas.datacontract.org/2004/07/CMachines" 
                              xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <!-- Copy everything not subject to the exceptions below -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
  <!-- Ignore the disabled element -->
  <xsl:template match="cm:Disabled" />
</xsl:stylesheet>