获得不同的价值; ASP.NET

时间:2011-09-06 18:48:41

标签: c# asp.net xslt xpath

在最近的一个项目中,我能够使用以下语法从我的XML文件中获取不同的值:

<xsl:for-each select="distinct-values($ds/datasource/Products-list/Products/CategoryName)">

但是现在,我们正在将项目迁移到ASP.NET,以下代码不起作用:

public DataSourceManager manager = new DataSourceManager();

protected void Page_Load(object sender, EventArgs e)
{
    this.manager.Get("http:***",
            "distinct-values(/datasource/Products-list/Products/CategoryName)", 
            new String[] { "." }, this.messageRepeater);
    }
}

Get函数如下所示:

public void Get(String datasourceUrl,
                String xpathToNodes,
                Array nodeNames,
                Repeater repeater,
                params String[] options ) {

    Debug.WriteLine("datasourceUrl= " + datasourceUrl);
    Debug.WriteLine("xpathToNodes= " + xpathToNodes);

    //call datasource url
    XmlDocument doc = new XmlDocument();
    doc.Load(datasourceUrl);

    //statusCode
    this.statusCode = doc.SelectSingleNode("/datasource/result/status/@code").Value;

    if (options.GetLength(0) > 0) {
        this.maxItem = Convert.ToInt16(options[0]);
    }

    //iterate
    this.list = new ArrayList();
    int count = 0;
    if (IsErrorCode == false) {
        XmlNodeList nodes = doc.SelectNodes(xpathToNodes);
        foreach (XmlNode node in nodes) {
            Hashtable row = new Hashtable();
            foreach (String nodeName in nodeNames) {
                row.Add(nodeName, node.SelectSingleNode(nodeName).InnerText);
            }
            list.Add(row);

            if (++count == this.maxItem) {
                break;
            }
        }
    }

    //data binding
    repeater.DataSource = list;
    repeater.DataBind();
}

返回的错误如下:

  

需要命名空间管理器或XsltContext。此查询具有前缀,变量或用户定义的函数。

如何在ASP.NET中获取不同的值?

2 个答案:

答案 0 :(得分:2)

编辑:安倍的回答看起来很不幸但很重要。如果您使用的是.NET 3.5或更高版本,我建议使用LINQ to XML,但如果您仍在使用非泛型集合,那么它并不乐观......可能是Abe答案中的链接是您最好的希望

答案 1 :(得分:2)

我相信distinct-values功能仅适用于xslt 2.0。如果您使用.NET内置的XSLT功能做任何事情,它只支持1.0。这可以解释你的错误。

不幸的是,在XSLT 1.0上选择不同的记录可能会有点痛苦。这个SO帖子是一个很好的方法:

How to use XSLT to create distinct values