逗号分隔的字符串解析 XSLT 到每个节点 [英] Comma separated string parsing XSLT to for-each node

查看:27
本文介绍了逗号分隔的字符串解析 XSLT 到每个节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含 csv 值的输入字符串.例如,1,2,3我需要将每个值分开并分配给 for-each 循环中的目标节点.

I have an input string which has csv values. Eg., 1,2,3 I would need to separate each values and assign to target node in for-each loop.

我在下面的模板中得到了这个基于分隔符分割输入字符串的模板.如何将每个分隔值分配给 for-each 循环中的目标元素.

I got this below template that splits the input string based on delimiter. How can I assign each of the delimited values to the target element in for-each loop.

<xsl:template name="output-tokens">
<xsl:param name="list"/>
<xsl:param name="delimiter"/>
<xsl:variable name="newlist">
  <xsl:choose>
    <xsl:when test="contains($list, $delimiter)">
      <xsl:value-of select="normalize-space($list)"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="concat(normalize-space($list), $delimiter)"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>
<xsl:variable name="first" select="substring-before($newlist, $delimiter)"/>
<xsl:variable name="remaining"
              select="substring-after($newlist, $delimiter)"/>
<xsl:variable name="count" select="position()"/>
<num>
  <xsl:value-of select="$first"/>
</num>
<xsl:if test="$remaining">
  <xsl:call-template name="output-tokens">
    <xsl:with-param name="list" select="$remaining"/>
    <xsl:with-param name="delimiter">
      <xsl:value-of select="$delimiter"/>
    </xsl:with-param>
  </xsl:call-template>
</xsl:if>
</xsl:template>

输入xml:

<out1:AvailableDates>
<out1:AvailableDate>15/12/2011,16/12/2011,19/12/2011,20/12/2011,21/12/2011</out1:AvailableDate>
</out1:AvailableDates>

预期输出:

<tns:AvailableDates>
<tns:AvailableDate>15/12/2011</tns:AvailableDate>
<tns:AvailableDate>16/12/2011</tns:AvailableDate>
<tns:AvailableDate>120/12/2011</tns:AvailableDate>
</tns:AvailableDates>

推荐答案

这是一个完整的、简短的、真正的 XSLT 1.0 解决方案:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:out1="undefined" xmlns:tns="tns:tns"
  exclude-result-prefixes="out1 tns">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="out1:AvailableDate">
  <tns:AvailableDates>
    <xsl:apply-templates/>
  </tns:AvailableDates>
 </xsl:template>

 <xsl:template match="text()" name="split">
  <xsl:param name="pText" select="."/>
  <xsl:param name="pItemElementName" select="'tns:AvailableDate'"/>
  <xsl:param name="pItemElementNamespace" select="'tns:tns'"/>

    <xsl:if test="string-length($pText) > 0">
     <xsl:variable name="vNextItem" select=
      "substring-before(concat($pText, ','), ',')"/>

      <xsl:element name="{$pItemElementName}"
                   namespace="{$pItemElementNamespace}">
       <xsl:value-of select="$vNextItem"/>
      </xsl:element>

      <xsl:call-template name="split">
        <xsl:with-param name="pText" select=
                       "substring-after($pText, ',')"/>
        <xsl:with-param name="pItemElementName" select="$pItemElementName"/>
        <xsl:with-param name="pItemElementNamespace" select="$pItemElementNamespace"/>
      </xsl:call-template>
    </xsl:if>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时(更正为格式正确):

<out1:AvailableDates xmlns:out1="undefined">
    <out1:AvailableDate>15/12/2011,16/12/2011,19/12/2011,20/12/2011,21/12/2011</out1:AvailableDate>
</out1:AvailableDates>

产生想要的、正确的结果:

<tns:AvailableDates xmlns:tns="tns:tns">
   <tns:AvailableDate>15/12/2011</tns:AvailableDate>
   <tns:AvailableDate>16/12/2011</tns:AvailableDate>
   <tns:AvailableDate>19/12/2011</tns:AvailableDate>
   <tns:AvailableDate>20/12/2011</tns:AvailableDate>
   <tns:AvailableDate>21/12/2011</tns:AvailableDate>
</tns:AvailableDates>

这篇关于逗号分隔的字符串解析 XSLT 到每个节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆