#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. Это работает! Вау .. это было так просто на самом деле? 🙂 Большое спасибо! Хорошего дня!