Цикл по различным значениям - PullRequest
6 голосов
/ 14 июля 2010

Учитывая переменную, которая возвращает список различных состояний с использованием функции Different-values ​​(), есть ли способ токенизации переменной в цикле for-each?

<States>
<State>AL</State>
<State>AL</State>
<State>NM</State>
</States>

Следующая переменная возвращаетAL и NM, но я не могу перебрать его, используя for-each.Есть ли способ обойти это?

<xsl:variable name="FormStates" select="distinct-values(States/State)"/>
  <xsl:for-each select="$FormStates">

XSLT 2.0 ок.

Ответы [ 3 ]

5 голосов
/ 15 июля 2010

Функция distinct-values() возвращает последовательность значений, которые вы должны иметь возможность перебирать. Результат так сказать "токенизированный".

fn:distinct-values('AL', 'AL', 'NL') возвращает последовательность ('AL', 'NL').

Если вы выводите переменную с помощью xsl:value-of, она вернет строку «AL NL» только потому, что разделитель последовательности по умолчанию для xsl:value-of представляет собой один пробел. Это то, что вы можете изменить с помощью атрибута @separator:

Input

<?xml version="1.0" encoding="UTF-8"?>
<States>
  <State>AL</State>
  <State>AL</State>
  <State>NM</State>
</States>

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:template match="/">
    <xsl:variable name="FormStates" select="distinct-values(States/State)"/>
    <xsl:comment>xsl:value-of</xsl:comment>
    <xsl:value-of select="$FormStates" separator=":"/>
    <xsl:comment>xsl:for-each</xsl:comment>
    <xsl:for-each select="$FormStates">
      <xsl:value-of select="."/>
      <xsl:text>:</xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

выход

<?xml version="1.0" encoding="UTF-8"?>
<!--xsl:value-of-->
AL:NM
<!--xsl:for-each-->
AL:NM:
2 голосов
/ 19 сентября 2013

Вот решение XSLT 1.0 , которое я использовал в прошлом.

  <xsl:template match="/">           
    <ul> 
      <xsl:for-each select="//State[not(.=preceding::*)]">
        <li>
          <xsl:value-of select="."/>
        </li>   
      </xsl:for-each>            
    </ul>
  </xsl:template>

Возвращает:

<ul xmlns="http://www.w3.org/1999/xhtml">
  <li>AL</li>
  <li>NM</li>
</ul>
0 голосов
/ 15 июля 2010

Теоретически это должно работать;Вы уверены, что XPath, заданный для функции distinct-values, верен?Код, который вы дали, требует, чтобы элемент States являлся родственным элементом forms.

Вы можете вставить <xsl:value-of select="count($FormStates)"> сразу после объявления переменной, чтобы убедиться, что она установлена ​​правильно.

...