Получение последних элементов из xml-массива с помощью преобразования xslt

#c# #xml #xslt

#c# #xml #xslt

Вопрос:

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

 
  <Car>
    <color>red</color>
    <type>toyota</type>
  </Car>
  <Car>
    <color>green</color>
    <type>mazda</type>
  </Car>
  <Car>
    <color>yellow</color>
    <type>ford</type>
  </Car>

 

В настоящее время я получаю всю информацию о cars с помощью xslt следующим образом

 <Cars>
  <xsl:for-each select="//list/record/car">
    <Car>
      <color>
        <xsl:value-of select="Color"/>
      </color>
      <type>
        <xsl:value-of select="Type"/>
      </type>
    </Car>
  </xsl:for-each>
</Cars>
 

Я хочу получить только элементы последнего car в списке с помощью xslt, чтобы мой новый xml имел одну запись car вместо 3 и выглядел так:

 <Car>
  <color>yellow</color>
  <type>ford</type>
</Car>
 

Ответ №1:

Используется last() для получения последнего элемента. Например: <xsl:for-each select="//list/record/car[last()]">

Если вы извлекаете только один элемент, вы можете удалить xsl:for-each . Например:

 <Cars>
      <Car> 
        <color><xsl:value-of select="//list/record/car[last()]/Color"/></color>
        <type><xsl:value-of select="//list/record/car[last()]/Type"/></type>
      </Car>       
  </Cars>
 

Также в зависимости от структуры вашего XML вы можете сократить его до:

 <Cars>
      <Car> 
        <color><xsl:value-of select="//car[last()]/Color"/></color>
        <type><xsl:value-of select="//car[last()]/Type"/></type>
      </Car>       
  </Cars>
 

Обновление — Как указывает @michael.hor257k, код можно упростить с помощью copy-of . Однако похоже, что xpath имеет другую оболочку для вывода.

 <Cars>
      <Car> 
          <xsl:copy-of select="//Car[last()]"/>
      </Car>       
  </Cars>
 

Примечание: ваш xml имеет Cars и ваш рабочий xpath имеет cars . Возможно, вам захочется дважды проверить правильность заполнения.*

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

1. Или просто: <xsl:copy-of select="//Car[last()]"/> .