Xslt объединить два нодлиста с разделителем - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь объединить два списка узлов, у которых есть дочерние элементы со строковым соединением, но я теряю теги xml в дочерних элементах

Ввод: node1: hello I am trying <abc> some </abc> xslt code

node2: but not working

ожидаемый вывод

hello I am trying <abc> some </abc> xslt code, but not working

1 Ответ

0 голосов
/ 05 ноября 2019

Если у вас есть последовательность из двух узлов элементов с содержимым, которое вы показали, и вы хотите создать вывод с разделителем , между этими узлами, то одним из способов будет протолкнуть элементы через шаблон, который добавляет разделитель:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="root">
      <xsl:param name="seq1" select="node1, node2"/>
      <xsl:copy>
          <xsl:apply-templates select="$seq1"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="node1 | node2">
      <xsl:if test="position() > 1">, </xsl:if>
      <xsl:apply-templates/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / pPJ8LVh

Если вы хотите работать на строковом уровне с string-join, то сначала нужно сериализоватьнапример,

  <xsl:output method="text"/>

  <xsl:template match="root">
      <xsl:param name="seq1" select="node1, node2"/>
      <xsl:copy>
          <xsl:value-of select="$seq1 ! serialize(node())" separator=", "/>
      </xsl:copy>
  </xsl:template>

https://xsltfiddle.liberty -development.net / pPJ8LVh / 1

  <xsl:output method="text"/>

  <xsl:template match="root">
      <xsl:param name="seq1" select="node1, node2"/>
      <xsl:variable name="str1" select="string-join($seq1 ! serialize(node()), ', ')"/>
      <xsl:copy>
          <xsl:value-of select="$str1"/>
      </xsl:copy>
  </xsl:template>

https://xsltfiddle.liberty -development.net / pPJ8LVh/ 2

Как видите, в последних двух примерах строки выводятся в виде текста, более вероятно, что вы захотите создать результирующие узлы, как это было сделано в первом предложении.

...