Перебор списка строк в xslt и использование индекса

#c# #xslt #xml-serialization

#c# #xslt #xml-сериализация

Вопрос:

Я работаю на C #. Я использую преобразования XSL (XSLT) версии 1.0. https://www.w3.org/TR/xslt Я использую xslt для создания xml из данных в классе MyClass MyClass соответствует шаблону и имеет свойство

  List<string> Strings
  

Мне нужно экспортировать его таким образом:

 <Line1> first string value Here </Line1>
<Line2> Second string value here </Line2>
.
.
.
  

Может ли кто-нибудь помочь мне понять, как это сделать?
Всего наилучшего

Комментарии:

1. Я этого не понимаю. Можете ли вы предоставить более явный образец исходного кода XML?

2. Вы говорите: «У меня есть класс для сопоставления шаблона со свойством». На каком языке программирования это? Какой процессор XSLT вы используете? Взаимодействие между XSLT и другими языками программирования во многом зависит от конкретного процессора, его API и платформы программирования.

3. @tal Я бы хотел, чтобы «новички» прочитали справку перед публикацией.

4. Почему вы хотите или должны использовать XSLT для перебора списка строк и создания XML-элементов? Это больше похоже на работу для LINQ list.Select((item, index) => new XElement("Line" index, item)) .

5. Подумайте о том, чтобы показать нам, что у вас есть в данный момент, т.Е. Покажите нам один образец класса со свойством или полем вместе с текущим XSLT, выполняющим эту работу, тогда мы получим представление о том, что вы пытаетесь сделать с этим List<string> свойством. Обычный ввод в XSLT — это XML, а не класс C #, поэтому нам нужно понять, где / как вы комбинируете классы C # и XSLT для создания другого XML.

Ответ №1:

Очень просто :

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication16
{
    class Program
    {

        static void Main(string[] args)
        {
            List<string> Strings = new List<string>() {
                    "first string value Here",
                    "Second string value here"
            };

            List<XElement> output = Strings.Select((x, i) => new XElement("Line"   (i   1).ToString(), x)).ToList(); 
        }

    }

}
  

Комментарии:

1. Спасибо за ответ. Мне нужно использовать шаблон xslt.

Ответ №2:

Я нашел решение. Может быть, есть лучший вариант… Я создал новый класс экспорта:

 public class ExportString
{
   [XmlElement("StringObject")]
   public string StringObject{get; set;}
}
  

Я создал список, поскольку свойство — это MyExportClass, который соответствует XSLT:

 public class MyExportClass
{
   [XmlElement("LOS"]
   public List<StringObject> LOS<get; set;}
}
  

Я использовал этот синтаксис в XSLT:
Код включает индекс в имя элемента :

 <xsl:for-each select="LOS" xml:space="default">

 //Get the index
  <xsl:variable name ="index" select="position()"/>

  <xsl:element name ="Line{$index}">
  <xsl:value-of select = "StringObject"/>
  </xsl:element>

   //Line break
  <xsl:text> amp;#xa;</xsl:text>
</xsl:for-each>
  

Результат:

 <Line1> my first string </Line1>
<Line2> my second string </Line2>
.
.
.