首页 > 解决方案 > 如何根据 XSLT 中单个标签的逗号分隔值生成多个标签?

问题描述

给定输入为 XML:

<root>
<article>测试1,测试2,测试3</article>
</root>

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

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

标签: xslt

解决方案


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

  <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


推荐阅读