Как разделить и присвоить значения во вложенных узлах с помощью Assign/XSLT в BPEL SOA?

#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, ',') . Я исправляю это в ответе, извините за это 🙂