простой цикл в xslt - PullRequest
       2

простой цикл в xslt

2 голосов
/ 12 августа 2011

Не удается понять простой цикл XSLT, который считает и возвращает имя актера.

<stars>
  <star ID="001">Leonardo DiCaprio</star>
  <star ID="002">Matt Damon</star>
  <star ID="003">Jack Nicholson</star>
</stars>

Это то, что я сделал, чтобы получить желаемый результат, но если бы был четвертый или пятый актер, мне нужно было бы добавить к коду.

<xsl:value-of select="stars/star[@ID='001']"/>
<xsl:text>, </xsl:text>
<xsl:value-of select="stars/star[@ID='002']"/>
<xsl:text>, </xsl:text>
<xsl:value-of select="stars/star[@ID='003']"/>

В основном мне нужен цикл для отображения названия звезды, разделенного запятой. Любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 12 августа 2011

Используйте шаблон вместо зацикливания.Процессоры XSLT оптимизированы для соответствия шаблонам.

<xsl:template match="star">
  <xsl:value-of select="." />
  <xsl:if test="position() != last()">
    <xsl:text>, </xsl:text>
  </xsl:if>
</xsl:template>
1 голос
/ 12 августа 2011

Это, вероятно, одно из самых простых преобразований - обратите внимание, что нет необходимости ни в xsl:for-each, ни в каких-либо явных условных инструкциях XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="star[position() >1]">
  <xsl:text>, </xsl:text><xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному исходному XML-документу :

<stars>
    <star ID="001">Leonardo DiCaprio</star>
    <star ID="002">Matt Damon</star>
    <star ID="003">Jack Nicholson</star>
</stars>

желаемый, правильный вывод производится :

Leonardo DiCaprio, Matt Damon, Jack Nicholson
1 голос
/ 12 августа 2011

Вы можете использовать инструкцию повторения (не беспокоясь о производительности):

<xsl:template match="stars">
    <xsl:value-of select="star[1]"/>
    <xsl:for-each select="star[position()>1]">
        <xsl:value-of select="concat(', ',.)"/>
    </xsl:for-each>
</xsl:template>

получает:

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