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