Как объединить текстовое значение нескольких узлов (с одинаковыми именами) и обновить другой узел, если общая длина> 20 символов? - PullRequest
0 голосов
/ 29 июня 2018

Я хотел бы объединить все значения Node2 в один Node2. Однако, если объединенная строка превышает 20 символов, я хочу добавить объединенную строку к Node1 и обрезать Node2 до 20 символов.

<Parent>
    <Node1>Some Text</Node1>
    <Node2>Some Name1</Node2>
    <Node2>Some Name2</Node2>
    <Node2>Some Name3</Node2>
    <Node2>Some Name4</Node2>
    <Node2>Some Name5</Node2>
</Parent>

Желаемый результат:

<Parent> 
  <Node1>Some Text; Node2: Some Name1, Some Name2, Some Name3, Some Name4, Some Name5</Node1> 
  <Node2>Some Name1, Some Nam</Node2> 
</Parent>

1 Ответ

0 голосов
/ 29 июня 2018

Попробуйте следующее решение XSLT-2.0:

<xsl:template match="/Parent">
    <xsl:copy>
        <xsl:copy-of select="@*" />
        <xsl:variable name="n2">
            <xsl:value-of select="Node2" separator=", "/>
        </xsl:variable>
        <Node1><xsl:value-of select="Node1, if (string-length($n2) > 20) then concat('; Node2: ',$n2) else ''" separator=""/></Node1>
        <Node2><xsl:value-of select="substring($n2,1,20)" /></Node2>
    </xsl:copy>
</xsl:template>

Вывод:

<?xml version="1.0" encoding="UTF-8"?>
<Parent>
   <Node1>Some Text; Node2: Some Name1, Some Name2, Some Name3, Some Name4, Some Name5</Node1>
   <Node2>Some Name1, Some Nam</Node2>
</Parent>
...