#xslt #middleware #soa #assign #bpel
#xslt #промежуточное программное обеспечение #soa #назначить #бпел
Вопрос:
Входные данные-:
<input>1,2,3</input>
1,2,3
значения, разделенные символом «,».
Требуемый результат-:
<ABC>
<AB>
<result>1</result>
</AB>
<AB>
<result>2</result>
</AB>
<AB>
<result>3</result>
</AB>
</ABC>
Ответ №1:
Вот решение XSLT 1.0. Он использует рекурсивный именованный шаблон. Я не уверен, что это можно сделать с помощью match="text()"
шаблона, что позволит избежать передачи параметров.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template name="split">
<xsl:param name="str" />
<xsl:if test="contains($str, ',')">
<AB>
<result><xsl:value-of select="substring-before($str, ',')" /></result>
</AB>
<xsl:call-template name="split">
<xsl:with-param name="str" select="substring-after($str, ',')" />
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="/">
<ABC>
<xsl:call-template name="split">
<xsl:with-param name="str" select="concat(input/text(), ',')" />
</xsl:call-template>
</ABC>
</xsl:template>
</xsl:stylesheet>
В XSLT 2 есть tokenize
функция, которая позволяет сделать это более лаконично :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/">
<ABC>
<xsl:for-each select="tokenize(input, ',')">
<AB>
<result><xsl:value-of select="." /></result>
</AB>
</xsl:for-each>
</ABC>
</xsl:template>
</xsl:stylesheet>
Комментарии:
1. Спасибо за ваш ответ @Fabian Pijcke, я использую XSL 1.0 Я использовал эту логику, но повторял один и тот же элемент. пример: ввод 1,2,3, но вывод, который я получаю, равен 1 только в каждом узле…. в остальном все работает нормально. не могли бы вы мне помочь?
2. О, действительно, я поставил
substring-before(., ',')
вместоsubstring-before($str, ',')
. Я исправляю это в ответе, извините за это 🙂