Получение значений из массивов с использованием индекса не работает — XSL

#xslt

#xslt

Вопрос:

Я создал массив, как показано ниже.

 <xsl:variable name="dispatchLiTotal" as="element()*">
    <xsl:for-each select=" /*/invoice/invline">
        <xsl:if test="/sbo/invoice/invline/deliverytotal">
            <xsl:for-each select="deliverytotal">
                <xsl:value-of select="subtotal" />
            </xsl:for-each>
        </xsl:if>
    </xsl:for-each>
</xsl:variable>
 

Позже в моем коде я беру из него значения, но я могу принимать только
«объединение строк», например, 171.15136.92128.99128.99126.00131.15124.611

 <xsl:value-of select="$dispatchLiTotal" />
 

Возвращается 171.15136.92128.99128.99126.00131.15124.611

 <xsl:value-of select="$dispatchLiTotal[1]" />
 

Возвращает ошибку:
javax.xml.преобразование.Исключение TransformerException:
java.язык.ClassCastException: класс
org.apache.xpath.objects.XRTreeFrag не может быть приведен к классу
org.apache.xpath.objects.XNodeSet (org.apache.xpath.objects.XRTreeFrag
и org.apache.xpath.objects.XNodeSet находятся в неназванном модуле загрузчика
«приложение»)

Я ожидаю, что индекс [1] вернет 171,15

Структура XML.

 <sbo>
<invoice>
    <invline>
    </invline>
    <invline>
        <deliverytotal>
            <subtotal>171.15</subtotal>
        </deliverytotal>
    </invline>
    <invline>
    </invline>
    <invline>
        <deliverytotal>
            <subtotal>136.92</subtotal>
        </deliverytotal>
    </invline>
</invoice>
 

Как я должен это сделать?

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

1. Можете ли вы перейти на процессор XSLT 2 или 3, например, Saxon 9 или 10? Использование as предполагает, что вы пытаетесь использовать XSLT 2 или 3, ошибка исходит от Xalan, процессора XSLT 1.

2. Итак, по вашему мнению, мой код будет работать, но я должен правильно изменить версию / движок?

3. Нет, не совсем, вы получите ошибку типа с XSLT 2, но если вы используете copy-of вместо value-of этого, это будет работать с XSLT 2. Вероятно, было бы проще просто использовать что-то вроде <xsl:variable name="dispatchLiTotal" select="/*/invoice/invline/deliverytotal/subtotal"/> , возможно, с предикатом для выражения xsl:if в чистом XPath, чтобы избежать проблемы. Но вы не показали нам структуру XML.

4. Правильно. Добавлена структура XML.

Ответ №1:

Похоже, что вы просто хотите выбрать входные элементы в виде последовательности или набора узлов с помощью, например <xsl:variable name="dispatchLiTotal" select="/*/invoice/invline/deliverytotal/subtotal"/> , затем $dispatchLiTotal[1] выбирает первый элемент в последовательности или наборе узлов. Это будет работать так же в XSLT 2/3 или 1, только технически в XSLT 2/3 вы имеете дело с последовательностью, в то время как в XSLT 1 это набор узлов.

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

1. Это работает! Вау .. это было так просто на самом деле? 🙂 Большое спасибо! Хорошего дня!