0

在我的 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 传递到我的代码隐藏?

4

2 回答 2

2

请注意,下面的 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在执行其中任何一项之前检查 的值。

于 2013-05-10T20:41:05.023 回答
2

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

<xsl:value-of
     select="custom:SelectPerson($selectedPerson//*[not(*)])"/>
于 2013-05-11T05:17:56.187 回答