создание массивов в xslt - PullRequest
25 голосов
/ 21 июля 2010

можно ли создавать и использовать массивы в xslt?Если да, то есть ли подходящие примеры онлайн для изучения?Если нет, то есть ли способ хранить значения таким образом, чтобы имитировать массив?

Ответы [ 5 ]

23 голосов
/ 21 июля 2010

С XSLT 2.0 вы можете моделировать любой тип данных, который вы хотите.

Как пример:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:variable name="array" as="element()*">
        <Item>A</Item>
        <Item>B</Item>
        <Item>C</Item>
    </xsl:variable>
    <xsl:template match="/">
        <xsl:value-of select="$array[2]"/>
    </xsl:template>
</xsl:stylesheet>

С любым входом, выход:

B

В XSLT 1.0 нет типа данных Временное дерево результатов. Существует тип данных Result Tree Fragment, который не допускает оператор набора узлов. Таким образом, единственный способ - использовать функции расширений: в данном случае node-set() из EXSLT (MSXSL также имеет встроенное расширение node-set()).

Итак, в XSLT 1.0 без расширений вы можете использовать только встроенную модель данных, либо по параметрам, либо по внешнему документу. Как пример:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:variable name="inline-array">
        <Item>A</Item>
        <Item>B</Item>
        <Item>C</Item>
    </xsl:variable>
    <xsl:param name="array" select="document('')/*/xsl:variable[@name='inline-array']/*"/>
    <xsl:template match="/">
        <xsl:value-of select="$array[2]"/>
    </xsl:template>
</xsl:stylesheet>

Результат с любым вводом:

B

Только если вы хотите, я могу предоставить вам пример расширений XSLT 1.0 plus (Это не стандарт ...)

8 голосов
/ 21 июля 2010

Последовательность XPath 2.0 (доступная в XSLT 2+) наиболее близка к массиву :

(1 to 10)[3]

оценивается как 3

('a', 'b', 'a', 'c')[3]

оценивается как 'a'

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

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

  1. Последовательности неизменны . Любая операция обновления последовательности (добавление или добавление элемента, вставка элемента или удаление элемента) создает новую последовательность.

  2. Не гарантируется, что время доступа к n-му элементу будет O (1) , так как это для массивов, и может быть O (n).

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

Нет, не как таковой. Наиболее близким понятием являются наборы узлов, которые являются коллекциями узлов. Всякий раз, когда результатом выбора является количество узлов, вы получаете набор узлов. К ним можно получить доступ с помощью индексной нотации (начиная с 1), поэтому к первому элементу набора узлов можно получить доступ с помощью нотации, например selectedNodes[1].

0 голосов
/ 05 марта 2019

Если нужен фильтр и foreach.(пример csv)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="2.0">
   <xsl:output method="text" omit-xml-declaration="yes" />
   <xsl:variable name="array" as="element()*">
      <column name="Company" enable="true">Company</column>
      <column name="User" enable="true">User</column>
   </xsl:variable>
   <xsl:variable name="separator">
      <xsl:text>;</xsl:text>
   </xsl:variable>
   <xsl:variable name="newline">
      <xsl:text>&#xa;</xsl:text>
   </xsl:variable>
   <!-- Output the CSV header -->
   <xsl:for-each select="msxsl:node-set($array)/column[@enable = 'true']">
      <xsl:value-of select="." />
      <xsl:if test="position() != last()">
         <xsl:value-of select="$separator" />
      </xsl:if>
   </xsl:for-each>
   <xsl:value-of select="$newline" />

<!-- your code inserted row -->

</xsl:stylesheet>

Подробнее

0 голосов
/ 11 августа 2018

С XSLT 2.0 вы можете просто использовать

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output omit-xml-declaration="yes"/>
    <xsl:template match="/">
    <xsl:variable name="array" select="('A','B','C')"/> 
        <xsl:value-of select="$array[2]"/>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...