XmlCompiledTransform 在替换元素的值时重复命名空间
XmlCompiledTransform duplicates namespace when replacing element's value
我正在尝试使用 XslCompiledTransform C# class 将一个 xml 文件转换为另一个文件。但是,名称空间第二次包含在我的元素之一 (SerialNum) 中。我做错了什么?
这是我的 C# 代码:
// Create a reader to read books.xml
XmlReader reader = XmlReader.Create("machine1.xml");
// Create a writer for writing the transformed file.
XmlWriter writer = XmlWriter.Create("machine2.xml");
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("transform.xsl");
// Execute the transformation.
transform.Transform(reader, writer);
这是我的 XSL:
<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="cd:Disabled" />
<!-- Reset the value of the serial num element to 0 -->
<xsl:template match="cm:SerialNum">
<SerialNum>0</SerialNum>
</xsl:template>
</xsl:stylesheet>
输入:
<?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>
输出:
<?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>
<SerialNum xmlns="" xmlns:cm="http://schemas.datacontract.org/2004/07/CMachines">0</SerialNum>
</Machine>
<Machine>
<Name>DellD600</Name>
<ID>2</ID>
<Type>Laptop</Type>
<SerialNum xmlns="" xmlns:cm="http://schemas.datacontract.org/2004/07/CMachines">0</SerialNum>
</Machine>
</ArrayOfMachine>
期望的输出:
<?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>
<SerialNum>0</SerialNum>
</Machine>
<Machine>
<Name>DellD600</Name>
<ID>2</ID>
<Type>Laptop</Type>
<SerialNum>0</SerialNum>
</Machine>
</ArrayOfMachine>
只需替换:
<xsl:template match="cm:SerialNum">
<SerialNum>0</SerialNum>
</xsl:template>
与:
<xsl:template match="cm:SerialNum">
<xsl:copy>0</xsl:copy>
</xsl:template>
您现在拥有的是在无名称空间中创建一个新的 SerialNum
元素 - 与继承其父名称空间的原始元素不同。这就是您看到 xmlns=""
声明的原因:它表明元素位于无名称空间中,与其父元素不同。
xmlns:cm="http://schemas.datacontract.org/2004/07/CMachines"
只是继承自 xsl:stylesheet
祖先。您可以通过向 xsl:stylesheet
元素添加 exclude-result-prefixes="cm"
属性来消除它 - 但仅复制原始 SerialNum
元素及其原始名称空间并且不继承样式表要简单得多。
我正在尝试使用 XslCompiledTransform C# class 将一个 xml 文件转换为另一个文件。但是,名称空间第二次包含在我的元素之一 (SerialNum) 中。我做错了什么?
这是我的 C# 代码:
// Create a reader to read books.xml
XmlReader reader = XmlReader.Create("machine1.xml");
// Create a writer for writing the transformed file.
XmlWriter writer = XmlWriter.Create("machine2.xml");
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("transform.xsl");
// Execute the transformation.
transform.Transform(reader, writer);
这是我的 XSL:
<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="cd:Disabled" />
<!-- Reset the value of the serial num element to 0 -->
<xsl:template match="cm:SerialNum">
<SerialNum>0</SerialNum>
</xsl:template>
</xsl:stylesheet>
输入:
<?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>
输出:
<?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>
<SerialNum xmlns="" xmlns:cm="http://schemas.datacontract.org/2004/07/CMachines">0</SerialNum>
</Machine>
<Machine>
<Name>DellD600</Name>
<ID>2</ID>
<Type>Laptop</Type>
<SerialNum xmlns="" xmlns:cm="http://schemas.datacontract.org/2004/07/CMachines">0</SerialNum>
</Machine>
</ArrayOfMachine>
期望的输出:
<?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>
<SerialNum>0</SerialNum>
</Machine>
<Machine>
<Name>DellD600</Name>
<ID>2</ID>
<Type>Laptop</Type>
<SerialNum>0</SerialNum>
</Machine>
</ArrayOfMachine>
只需替换:
<xsl:template match="cm:SerialNum">
<SerialNum>0</SerialNum>
</xsl:template>
与:
<xsl:template match="cm:SerialNum">
<xsl:copy>0</xsl:copy>
</xsl:template>
您现在拥有的是在无名称空间中创建一个新的 SerialNum
元素 - 与继承其父名称空间的原始元素不同。这就是您看到 xmlns=""
声明的原因:它表明元素位于无名称空间中,与其父元素不同。
xmlns:cm="http://schemas.datacontract.org/2004/07/CMachines"
只是继承自 xsl:stylesheet
祖先。您可以通过向 xsl:stylesheet
元素添加 exclude-result-prefixes="cm"
属性来消除它 - 但仅复制原始 SerialNum
元素及其原始名称空间并且不继承样式表要简单得多。