You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:39:02