SelectSingleNode评估LowerCase NodeSet值

时间:2013-05-02 11:20:47

标签: c# xslt xpath

我试图使用SelectSingleNode以小写形式获取xpath表达式的值,是否有一个Xpath可以给我一个评估的xpath表达式的小写值?

可以使用xsl转换表,但是可以使用下面的吗?

该函数期望具有nodeset类型,下面求值为string,因此它抛出异常。是否可以将返回的字符串转换为节点集以使SelectSingleNode满意

        string xml = "<bac><test>Val</test></bac>";
        string xpath = "/bac/test/text()";

        var transpath = "translate(/bac/test/text(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')";

        StringReader sReader = new StringReader(xml);

        XmlReader xReader = new XmlTextReader(sReader);            
        XPathDocument xmlPathDoc = new XPathDocument(xReader);
        XPathNavigator nav = xmlPathDoc.CreateNavigator();

        XPathNodeIterator nodeIterator = nav.Select("/");

        XPathNavigator navNode = nodeIterator.Current;
        var v = navNode.SelectSingleNode(transpath).Value;
       // expect val 

1 个答案:

答案 0 :(得分:1)

如果您的XPath表达式返回原始值(字符串,数字,布尔值)而不是一组节点,则需要使用Evaluate上的XPathNavigator方法,请参阅{{3} }。

因此,对于您的代码,您可以将其简化为

    string xml = "<bac><test>Val</test></bac>";
    string xpath = "/bac/test";

    var transpath = "translate(/bac/test,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')";

     XPathNavigator nav;
     using (StringReader sr = new StringReader(xml))
     {
        nav = new XPathDocument(sr).CreateNavigator();
     }
     string v = nav.Evaluate(transpath) as string;

另一方面,.NET在字符串操作方面比XPath 1.0强,所以我很想使用

 XPathNavigator test = nav.SelectSingleNode(path);
 string v = test.Value.ToLower();