XSL - список эквивалентных реализаций - PullRequest
0 голосов
/ 28 апреля 2011

Я хотел бы знать, есть ли у нас что-то в XSL 2.0, эквивалентное списку в Java. Я хотел бы 10 раз рекурсивно вызвать шаблон и передать входную переменную с именем «mylist». В шаблоне я хочу выполнять такие операции, как добавление элемента в список, удаление элемента из списка, перебор элементов в списке и т. Д. Я мог видеть что-то вроде «последовательности», но я не уверен, что его можно использовать для добавления, удаления , повторять и т.д. Пожалуйста, поделитесь своими идеями для реализации этого.

Я попытался использовать последовательность с помощью приведенного ниже ответа, у меня возникли некоторые проблемы с синтаксисом, такие как объявление пустой последовательности. Я хочу напечатать последовательность 1 2 3 4 5 6 7 8 9 10, используя функции вставки перед или последовательной последовательности. Пожалуйста, помогите мне исправить синтаксис.

  <xsl:stylesheet version="2.0" 
  xmlns:locator="http://ntr.lxnx.org"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  <xsl:template match="/"> 
  <xsl:variable name="output">
  <xsl:call-template name="calculate-data"> 
                <xsl:with-param 
                    name="sequence" 
                    select=""/> 
                 <xsl:with-param 
                    name="count"  
                    select="1"/>
            </xsl:call-template> 
  </xsl:variable>
  <xsl:value-of select="output"></xsl:value-of>
  </xsl:template>  
  <xsl:variable name="main-root" as="document-node()" select="/"/>

  <xsl:template name="calculate-data">
<xsl:param name="sequence"/>
  <xsl:param name="count" select="0"/>
<xsl:if test="$count != 10">
                fn:insert-before($count as item()*,0 as xs:integer,$sequence as item()*)
                <xsl:call-template name="calculate-data"> 
                    <xsl:with-param 
                        name="sequence" 
                        select="$sequence"/> 
                     <xsl:with-param 
                        name="count"  
                        select="$count + 1"/>
                </xsl:call-template>              


</xsl:if> 
        </xsl:template>
        </xsl:stylesheet>

1 Ответ

4 голосов
/ 28 апреля 2011

С пояснением, что экземпляр последовательности, как и все остальное в XPath / XSLT, является неизменным, ответ положительный :

  1. Повторениенад последовательностью :

    <xsl:for-each select="$seq">
     <!-- Whatever necessary code here -->
     <!-- . is the current item of the sequence-->
    </xsl:for-each>
    
  2. Добавить элемент в последовательность (создает новую последовательность, которая является результатомэта операция):

       insert-before($target as item()*,
                     $position as xs:integer,
                     $inserts as item()*) as item()*
    

Сводка : Возвращает новую последовательность, построенную из значения $ target со значением $ insert, вставленным впозиция определяется значением $ position.(На значение $ target не влияет построение последовательности.)

. 3. Объединение двух последовательностей (создает новую последовательность, являющуюся результатом этой операции):

   $seq1 , $seq2

. .4. Удалить элемент из последовательности :

     remove($target as item()*, $position as xs:integer) as item()*

Summary : Возвращает новую последовательность, построенную из значения $ targetпри удалении элемента в позиции, указанной значением $ position

. .5. Извлечение подпоследовательности из последовательности :

   subsequence($sourceSeq as item()*,
               $startingLoc as xs:double,
               $length as xs:double) **as item**()*

Сводка : Возвращает непрерывную последовательность элементов в значении $sourceSeq начинается с позиции, обозначенной значением $ startLoc, и продолжается для количества элементов, обозначенного значением $ length.

И есть еще много полезных стандартных XPath2.0 работает над последовательностями .

Примечание : единственная особенность, которой нет в последовательности XPath 2.0, - это "вложенность".Последовательность всегда "плоская", и элемент последовательности не может быть самой последовательностью.Существуют способы имитации многоуровневых последовательностей - например, элемент может быть узлом, а его дочерние узлы могут рассматриваться как вложенные последовательности.

Обновление : Вот как этиФункции могут быть удобно использованы для решения обновленного вопроса ОП:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:my="my:my" >

 <xsl:template match="/">
  <xsl:sequence select="my:populateSequence((), 1, 10)"/>
 </xsl:template>

 <xsl:function name="my:populateSequence" as="xs:integer*">
  <xsl:param name="pSeq" as="xs:integer*"/>
  <xsl:param name="pStart" as="xs:integer"/>
  <xsl:param name="pEnd" as="xs:integer"/>

  <xsl:sequence select=
   "if($pStart gt $pEnd)
      then $pSeq
      else my:populateSequence(($pSeq, $pStart), $pStart+1, $pEnd)
   "/>
 </xsl:function>
</xsl:stylesheet>

Когда это преобразование XSLT 2.0 применяется к любому XML-документу (не используется), получается требуемый результат :

1 2 3 4 5 6 7 8 9 10
...