XSLT 外部参数拆分



我是xsl转换的新手,所以我一直在研究如何做到这一点一段时间了,我正在尝试将外部参数放入xsl中,这是一个由逗号分隔的名称串联列表,然后拆分该参数,我有一个xml如下:

<root>
<contacts>
<contact>   
<name></name>       
</contact>
<contact>
<name></name>
</contact>
<contact>
<name></name>
</contact>
</contacts>

这是我到目前为止的xsl,我的外部参数称为EXT:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="EXT"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="name/text()" name="tokenize">
<xsl:param name="text" select="."/>
<xsl:param name="separator" select="','"/>
<xsl:choose>
<xsl:when test="not(contains($text, $separator))">
<name>
<xsl:value-of select="normalize-space($text)"/>
</name>
</xsl:when>
<xsl:otherwise>
<name>
<xsl:value-of select="normalize-space(substring-before($text, $separator))"/>
</name>
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="substring-after($text, $separator)"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

因此,例如,我收到一个参数,例如"约翰,彼得,杰克",所需的结果是:

<root>
<contacts>
<contact>   
<name>John</name>       
</contact>
<contact>
<name>Peter</name>
</contact>
<contact>
<name>Jack</name>
</contact>
</contacts>

我最接近这个结果的是这样的:

<root>
<contacts>
<contact>   
<name>John</name>
<name>Peter</name>  
<name>Jack</name>   
</contact>
<contact>
<name></name>
</contact>
<contact>
<name></name>
</contact>
</contacts>

任何帮助将不胜感激。

如果还可以对contact元素进行硬编码,只需将它们添加到结果中即可。这只是一个最小的更改:

<xsl:template match="contacts">
<xsl:copy>
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="$EXT"/>
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template  name="tokenize">
<xsl:param name="text" select="."/>
<xsl:param name="separator" select="','"/>
<xsl:choose>
<xsl:when test="not(contains($text, $separator))">
<contact>
<name>
<xsl:value-of select="normalize-space($text)"/>
</name>
</contact>
</xsl:when>
<xsl:otherwise>
<contact>
<name>
<xsl:value-of select="normalize-space(substring-before($text, $separator))"/>
</name>
</contact>
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="substring-after($text, $separator)"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

这将创建所需的输出。

最新更新