将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传递到我的后台代码?
您还没有向我们展示$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
的值