xsl: преобразование xml в csv - поиск по значению, иначе выведите пустое поле - PullRequest
0 голосов
/ 19 августа 2011

У меня есть XML-структура, такая как:

   <foos>
      <foo>
        <foo_type>1</foo_type>
        <foo_date>2011_1_1</foo_date>
      </foo>
      <foo>
        <foo_type>1</foo_type>
        <foo_date>2012_1_1</foo_date>
      </foo>
      <foo>
        <foo_type>2</foo_type>
        <foo_date>2011_1_1</foo_date>
      </foo>
    </foos>

Что мне нужно сделать, это получить одно значение из этого, где foo_type == 1, а дата - самая поздняя дата.Ранее я использовал сортировку по убыванию для списка дат.Если foo_type == 1 отсутствует, то должно появиться пустое поле.(Поля заключены в кавычки, запятая - это разделитель.)

Я планировал сделать это, создав список всех объектов типа 1. Я не уверен, как это сделать в xsl.что-то вроде этого:

        <xsl:variable name="fooList">
            <xsl:for-each select="foos/foo">
                <xsl:if test="contains(foo_type, '1')">
                    <xsl:value-of select="concat($fooList, ', ', foo_date)"/>
                </xsl:if>
            </xsl:for-each>
        </xsl:variable>

тогда я бы проанализировал список, разделенный запятыми, и отсортировал бы, чтобы определить самую последнюю дату:

       <xsl:variable name="latestFooDate">
            <xsl:sort select="split(fooList)" order="descending" />
       </xsl:variable>

и, наконец, вызвал шаблон для форматирования результата:

        <xsl:call-template name="dateFormat">
            <xsl:with-param name="date" select="latestFooDate" />
        </xsl:call-template>

Имейте в виду, что это псевдокод, потому что я не знаю, как это сделать.Теперь, если кто-то может помочь превратить мое псевдо в настоящее.

1 Ответ

0 голосов
/ 23 августа 2011

Не думаю, что вам нужно создавать список с разделителями-запятыми, прежде чем вы получите первое свидание.Это похоже на дополнительные усилия.Вы можете отсортировать элементы foo в своем операторе xsl: for-each , а затем просто получить первый (т. Е. Элемент с position () = 1 )

Попробуйте этот шаблон для сопоставления foos элемента

   <xsl:template match="foos">
      <xsl:for-each select="foo[foo_type='1']"> 
         <xsl:sort select="foo_date" />
         <xsl:if test="position() = 1">
            <xsl:value-of select="foo_date" />
         </xsl:if>
      </xsl:for-each> 
   </xsl:template>

Это зацикливает все элементы foo с foo_type из 1, но затем выполняет какую-либо обработку только для первого.

Когда вы используете этот шаблон для соответствия заданному вами входному XML, результат должен быть

2011_1_1

.продолжайте и выполняйте дополнительное форматирование даты по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...