将XSLT元素传递给c#代码

本文关键字:代码 XSLT 元素 | 更新日期: 2023-09-27 18:12:59

在我的XML中,我有这样的内容:

<people>
    <person>
        <name>
            <first>Bob</first>
            <last>Bobbertson</last>
        </name>
        <age>80</age>
    </person>
    ...
</people>

我希望能够将整个<person>部分传递到我的代码后面,以便在我的c#代码中,我可以访问所有的子节点(<name>, <first>, <last>)。

我使用XSLT生成HTML,在我的XSLTfile中,有这样一行:

<xsl:value-of select="custom:SelectPerson($selectedPerson)"/>

在我的代码后面:

public string SelectPerson(System.Xml.XPath.XPathNodeIterator selectedPersonNodes)
{
    foreach (var node in selectedPersonNodes)
    {
        Debug.WriteLine(node.ToString());
    }
    ...
}

我想要发生的是让foreach循环三次,并打印出"Bob",然后是"Bobbertson",然后是"80"。但实际情况是,它运行一次并打印出"BobBobbertson80"。

是否有一种方法可以按照我想要的方式将节点从xslt生成的HTML传递到我的后台代码?

将XSLT元素传递给c#代码

您还没有向我们展示$selectedPerson是如何定义的,但是我建议尝试将一组单独的节点传递给函数:

<xsl:value-of
     select="custom:SelectPerson($selectedPerson//*[not(*)])"/>

请注意,下面的c#代码是未经测试的,因为我没有访问c#开发环境的权限。

你的c#代码做的是正确的。传递的是一个只包含一个节点的迭代器。(检查selectedPersonNodes.Count检查)。该节点是元素<person>,如您所说,它有后代,但它仍然是单个节点。

假设您的XPathNodeIterator可以包含多个person元素,您应该写

foreach (var person in selectedPersonNodes)
{
  Debug.WriteLine(person.SelectSingleNode("name/first").ToString());
  Debug.WriteLine(person.SelectSingleNode("name/last").ToString());
  Debug.WriteLine(person.SelectSingleNode("age").ToString());
}

或者如果它总是包含一个单个人,你可以说

selectedPersonNodes.MoveNext();
XPathNavigator person = selectedPersonNodes.Current;
Debug.WriteLine(person.SelectSingleNode("name/first").ToString());
Debug.WriteLine(person.SelectSingleNode("name/last").ToString());
Debug.WriteLine(person.SelectSingleNode("age").ToString());

但是,正如我所说的,在执行这些操作之前,您可能需要检查selectedPersonNodes.Count的值