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>
正如我在对您的问题的评论中提到的,只有两个值,简单的解决方案是使用 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
输入:
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>
正如我在对您的问题的评论中提到的,只有两个值,简单的解决方案是使用 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