如何基于XSLT中单个标签的逗号分隔值生成多个标签?

时间:2018-10-11 09:27:16

标签: xslt

以XML输入:

<root>
         <article> test1,test2,test3 </article>
</root>

现在需要XSLT逻辑来生成输出XML

<article>test1</article> <article>test2</article> <article>test3</article>

1 个答案:

答案 0 :(得分:1)

通常,您需要tokenize的内容article,并在XSLT 3中使用article为每个令牌创建一个新的xsl:element元素实现该目标的方法是

  <xsl:template match="article">
      <xsl:apply-templates select="tokenize(., ',')">
          <xsl:with-param name="element-name" select="node-name()"/>
      </xsl:apply-templates>
  </xsl:template>

  <xsl:template match=".[. instance of xs:string]">
      <xsl:param name="element-name"/>
      <xsl:element name="{$element-name}">{.}</xsl:element>
  </xsl:template>

需要最少但完整的样本

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

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

  <xsl:output indent="yes"/>

  <xsl:template match="article">
      <xsl:apply-templates select="tokenize(., ',')">
          <xsl:with-param name="element-name" select="node-name()"/>
      </xsl:apply-templates>
  </xsl:template>

  <xsl:template match=".[. instance of xs:string]">
      <xsl:param name="element-name"/>
      <xsl:element name="{$element-name}">{.}</xsl:element>
  </xsl:template>

</xsl:stylesheet>

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