【发布时间】:2014-01-28 09:52:25
【问题描述】:
我遇到了一个问题,没有任何东西被替换。
我查看了 rename nodes 和 replace values 的其他 SO 问题,并从答案中复制了示例,但对我没有任何帮助。我怀疑我有一些微妙的错误,但我查看了我的 C#、XML 和 XSL 代码,但似乎找不到。
这是我的 C# 代码:
private static string GetOutput(string xmlFileName, string xslFileName)
{
var xmlDocument = new XmlDocument();
xmlDocument.Load(xmlFileName);
var xslTransform = new XslCompiledTransform();
xslTransform.Load(xslFileName);
var stream = new MemoryStream();
xslTransform.Transform(xmlDocument, null, stream);
stream.Position = 1;
var reader = new StreamReader(stream);
string output = reader.ReadToEnd();
return output;
}
这是我的 XML 文件的内容:
<?xml version="1.0" encoding="utf-8" ?>
<TransformThis xmlns="http://schemas.datacontract.org/2004/07/TransformTest"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<f_name>John</f_name>
<l_name>D'Oh!</l_name>
<Version>1.0</Version>
</TransformThis>
这是我的 XSL 文件的内容:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Version/text()[.='1.0']">1.1</xsl:template>
<xsl:template match="f_name">
<FirstName>
<xsl:apply-templates select="node()|@*"/>
</FirstName>
</xsl:template>
<xsl:template match="l_name">
<LastName>
<xsl:apply-templates select="node()|@*"/>
</LastName>
</xsl:template>
</xsl:stylesheet>
当我运行我的程序时,输出与原始 XML 相同。 f_name 和 l_name 节点都没有被重命名,Version 节点的值也没有被替换。
任何帮助将不胜感激。
更新根据下面 michael.hor257k 的回答,我已将我的 XLS 文件修改如下:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tx="http://schemas.datacontract.org/2004/07/TransformTest"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tx:Version/text()[.='1.0']">1.1</xsl:template>
<xsl:template match="tx:f_name">
<FirstName>
<xsl:apply-templates select="node()|@*"/>
</FirstName>
</xsl:template>
<xsl:template match="tx:l_name">
<LastName>
<xsl:apply-templates select="node()|@*"/>
</LastName>
</xsl:template>
</xsl:stylesheet>
我将 ...TransformTest 命名空间添加到 XLS 文件中,并在 match 节点前加上 tx:。
现在转换正在工作,但它也将 tx: 命名空间添加到重命名的节点:
<?xml version="1.0" encoding="utf-8"?>
<Transformer xmlns="http://schemas.datacontract.org/2004/07/TransformTest"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<FirstName xmlns="" xmlns:tx="http://schemas.datacontract.org/2004/07/TransformTest">John</FirstName>
<LastName xmlns="" xmlns:tx="http://schemas.datacontract.org/2004/07/TransformTest">Doh</LastName>
<Version>1.1</Version>
</Transformer>
此外,当 XML 反序列化为对象时,LastName 和 FirstName 属性为空,我怀疑这与这些节点上的其他命名空间属性有关。
我希望输出看起来像原始 XML,但只更改名称和值。
UPDATE #2 michael.hor257k 添加:他的答案中的示例 XLS 文件。这解决了我的所有问题。
【问题讨论】: