xslt由定界符分割

问题描述 投票:0回答:2

我不能使用标记化(xslt 2.0)

我有问题。我需要基于定界符“ \ n”分割一个值“ Test street \ nStreet 2 \ nStreet3”以产生

        <address1>Test street</address3>
        <address2>Street 2</address3>
        <address3>Street3</address3>

到目前为止,我有这个:

<xsl:call-template name="tokenize">
    <xsl:with-param name="text" select="ns0:sObject/ens:BillingStreet"/>
</xsl:call-template>

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="separator" select="'\n'"/>
    <xsl:choose>
        <xsl:when test="not(contains($text, $separator))">
            <Address>
                <xsl:value-of select="normalize-space($text)"/>
            </Address>
        </xsl:when>
        <xsl:otherwise>
            <Address>
                <xsl:value-of select="normalize-space(substring-before($text, $separator))"/>
            </Address>
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $separator)"/>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

它给了我这个:

        <Aaddress>Test street</Address>
        <Aaddress>Street 2</Address>
        <Aaddress>Street3</Address>

我尝试使用position(),但无法正常工作:

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="separator" select="'\n'"/>
    <xsl:choose>
        <xsl:when test="not(contains($text, $separator))">
            <xsl:element name="Address{position()}">
                <xsl:value-of select="normalize-space($text)"/>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
            <xsl:element name="Address{position()}">
                <xsl:value-of select="normalize-space(substring-before($text, $separator))"/>
            </xsl:element>
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $separator)"/>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

以上给了我:

        <Address1>Test street</Address1>
        <Address1>Street 2</Address1>
        <Address1>Street3</Address1>

再次,我正在寻找的是:

        <Address1>Test street</Address1>
        <Address2>Street 2</Address2>
        <Address3>Street3</Address3>

有什么想法吗?

感谢

xml xslt delimiter tokenize
2个回答
0
投票

['\n'不是带有换行符的字符串...使用字符引用'&#xA;'

[此外,请注意position()函数针对当前上下文列表起作用。调用命名模板后,这种情况不会改变。因此,您的样式表片段取决于您尚未显示给我们的其他部分。


0
投票

position()在这里并不重要,因为它返回当前所选节点的位置。

您将必须通过另一个参数来跟踪递归模板正在进行的迭代:

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="separator" select="'\n'"/>
    <xsl:param name="pos" select="1" ></xsl:param>
    <xsl:choose>
        <xsl:when test="not(contains($text, $separator))">
            <xsl:element name="Address{$pos}">
                <xsl:value-of select="normalize-space($text)"/>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
            <xsl:element name="Address{$pos}">
                <xsl:value-of select="normalize-space(substring-before($text, $separator))"/>
            </xsl:element>
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $separator)"/>
                <xsl:with-param name="pos" select="$pos + 1" />
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template> 
© www.soinside.com 2019 - 2024. All rights reserved.