XSLT 拆分字符串,将它们存储在变量中并输出

XSLT Spliting a string ,storing them in variables and output them

输入:

stringToSplit = 251#999999999 (areaCode + # + pNumber)

问题:

我想使用 XSLT 拆分该字符串 (token = #) 并将 areaCode 和 pNumber 存储在不同的变量中,这样我就可以将它们放入我想要的结构中

解决方案伪代码:

XML 输入

<stringToSplit>351#911111111</stringToSplit>

XSLT 2.0

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:template match="/">
        <xsl:variable name="stringToSplit2" select="stringToSplit" />
        <xsl:variable name="items" select="tokenize($stringToSplit2, '#')"/> 

        <stringToSplit> 
            <xsl:value-of select="stringToSplit"/>
        </stringToSplit>

        <areaCode> 
            <xsl:value-of select="$items[1]"/>
        </areaCode>
        <pNumber> 
            <xsl:value-of select="$items[2]"/>
        </pNumber>

    </xsl:template>
</xsl:stylesheet>

XSLT 1.0

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

<xsl:template match="/">
    <result>
        <areaCode> 
            <xsl:value-of select="substring-before(stringToSplit, '#')"/>
        </areaCode>
        <pNumber> 
            <xsl:value-of select="substring-after(stringToSplit, '#')"/>
        </pNumber>
    </result>
</xsl:template>

</xsl:stylesheet>

测试

Notepad++ faulty result --> Notepad++ XML 工具(插件)- XSL 转换(功能)仅适用于 XSLT 1.0

要么使用一个变量,例如<xsl:variable name="items" select="tokenize($stringToSplit, '#')"/> 然后 <xsl:value-of select="$items[1]"/><xsl:value-of select="$items[2]"/> 或设置三个变量,第二个和第三个基于我已经显示的那个,即 <xsl:variable name="item1" select="$items[1]"/><xsl:variable name="item2" select="$items[2]"/>

正如评论中已经指出的那样,根据上述建议,您的示例看起来像

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:template match="/">
        <xsl:variable name="stringToSplit2" select="stringToSplit" />
        <xsl:variable name="items" select="tokenize($stringToSplit2, '#')"/> 

        <stringToSplit> 
            <xsl:value-of select="stringToSplit"/>
        </stringToSplit>

        <areaCode> 
            <xsl:value-of select="$items[1]"/>
        </areaCode>
        <pNumber> 
            <xsl:value-of select="$items[2]"/>
        </pNumber>

    </xsl:template>
</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/3NSSEuT

正如我在对您的问题的评论中提到的,只有两个值,简单的解决方案是使用 substring-before()substring-after() 函数:

XSLT 1.0

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

<xsl:template match="/">
    <result>
        <areaCode> 
            <xsl:value-of select="substring-before(stringToSplit, '#')"/>
        </areaCode>
        <pNumber> 
            <xsl:value-of select="substring-after(stringToSplit, '#')"/>
        </pNumber>
    </result>
</xsl:template>

</xsl:stylesheet>

这不仅更简单,而且还适用于 XSLT 1.0(这显然是您正在使用的版本):https://xsltfiddle.liberty-development.net/3NSSEuT/1