C#执行XML转HTML的XSLT转换时XPath查询取不到值问题求助
问题原因分析及解决方案
经过排查,你的XPath路径写法本身是正确的,问题出在C#调用转换的逻辑和资源处理部分,具体修复方案如下:
1. 核心问题:流资源未正确释放导致输出不完整
你当前代码中创建的StreamWriter在执行完转换后没有主动刷新缓冲区、释放资源,转换后的部分内容会滞留在内存中没有写入到result.html文件,会表现为属性值、部分内容缺失。
你可以将C#代码修改为用using语句自动管理资源释放,修改后代码如下:
private void button1_Click(object sender, EventArgs e) { OpenFileDialog v1 = new OpenFileDialog(); OpenFileDialog v2 = new OpenFileDialog(); // 用Path.Combine拼接路径,避免不同系统分隔符兼容问题 string output = Path.Combine(Environment.CurrentDirectory, "result.html"); v1.Filter = "fichiers XML (*.xml) | *.xml"; v2.Filter = "fichier xslt (*.xslt) | *.xslt"; if (v1.ShowDialog() == DialogResult.OK && v2.ShowDialog() == DialogResult.OK) { XslCompiledTransform mytransform = new XslCompiledTransform(); mytransform.Load(v2.FileName); XsltArgumentList list = new XsltArgumentList(); // using语句会在代码块结束后自动关闭StreamWriter,刷新缓冲区写入文件 using (StreamWriter result = new StreamWriter(output)) { mytransform.Transform(v1.FileName, list, result); } } }
2. 可选排查点(修改代码后仍异常时可检查)
- 确认XML源文件中
page节点的numero属性值确实为字符串01,没有多余空格、或者不带前导零的情况 - 确认XML源文件没有隐藏的默认命名空间,如果有需要在XSLT头部声明对应命名空间前缀后,再在XPath中携带前缀查询
- 可以先在XSLT中临时输出
<xsl:value-of select = "/bilans/bilan/detail/page/@numero"/>验证路径是否能够匹配到节点,逐步定位匹配中断的层级
内容的提问来源于stack exchange,提问作者Sofiane
相关产品推荐
相关产品推荐

