2013-05-10 2 views
0

В моем XML, у меня есть что-то вроде этого:Pass XSLT элемент C# код

<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».

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

ответ

2

Вы не показали нам, как $selectedPerson определена, но я бы предложил попробовать это передать набор отдельных узлов функции:

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

Я не знал, что вы можете это сделать. Спасибо, это решило мою проблему! – Kalina

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

+0

Второе решение работает для меня, спасибо! – Kalina