在XSLT中拆分和转换分隔的字符串

时间:2014-12-18 17:03:33

标签: xml xslt xpath xslt-1.0 xslt-grouping

这是我要转换的XML示例:

<dsQueryResponse>
  <Rows>
    <Row Contacts="#111;#Smith, John;#112;#Sue, Mary;#113;#Jones, Rick" />
    <Row Contacts="#114;#Lee, Thomas;#115;#Richards, Kate" />
  </Rows>
</dsQueryResponse>

使用XSLT,如何将其拆分以使其输出如下:

<div>
  <span>#111;#Smith, John</span>
  <span>#112;#Sue, Mary</span>
  <span>#113;#Jones, Rick</span>
</div>
<div>
  <span>#114;#Lee, Thomas</span>
  <span>#115;#Richards, Kate</span>
</div>

;被用作分隔符,而每组都包含它,这让我感到困惑。


修改
是的,我知道这个post 我已经尝试了但它并没有按照我需要的方式进行分割。
;是分隔符也是分裂的一部分。

1 个答案:

答案 0 :(得分:2)

以这种方式尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/dsQueryResponse">
    <body>
        <xsl:for-each select="Rows/Row">
            <div>
               <xsl:call-template name="tokenize">
                    <xsl:with-param name="text" select="@Contacts"/>
                </xsl:call-template>
            </div>
        </xsl:for-each>
    </body>
</xsl:template>

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="delimiter" select="';'"/>
    <xsl:choose>
        <xsl:when test="contains($text, $delimiter) and contains(substring-after($text, $delimiter), $delimiter)">
            <span>
                <xsl:value-of select="substring-before($text, $delimiter)"/>
                <xsl:value-of select="$delimiter"/>
                <xsl:value-of select="substring-before(substring-after($text, $delimiter), $delimiter)"/>
            </span>
            <!-- recursive call -->
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after(substring-after($text, $delimiter), $delimiter)"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <span>
                <xsl:value-of select="$text"/>
            </span>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

注意
如果存在XML地狱,则源文档的作者将在其中刻录。