Передать элемент XSLT в код C#

В моем 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 зациклите три раза и распечатайте "Боб", затем "Боббертсон", затем "80". Но происходит то, что он проходит один раз и печатает "BobBobbertson80".

Есть ли способ передать узлы желаемым образом из сгенерированного XSLT HTML в мой код?

2 ответа

Решение

Вы не показали нам, как $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 прежде чем сделать что-либо из этого.

Другие вопросы по тегам