xsl:如何拆分string?

我想将分号( ; )的地址分隔成由<br />分隔的行:

如果address = 123 Elm Street ,我想输出123 Elm Street

但是如果address = 123 Elm Street;PO Box 222 ,我想输出

 123 Elm Street<br />PO Box 222 

如果address = 123 Elm Street;PO Box 222;c/o James Jones ,我想输出

 123 Elm Street<br />PO Box 222<br />c/o James Jones 

有没有办法做到这一点? (可能很容易,但我不熟悉XSLT)

普通的XSLselect器是

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

我想修改这个XSLT片段以分号分割。


更新 :显然,答案涉及使用<xsl:call-template>和函数substring-before()substring-after()

但是我是XSLT的初学者,我真的可以使用一些帮助来做到这一点。

I.简单的XSLT 1.0解决scheme:

这个转变

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="text()" name="split"> <xsl:param name="pText" select="."/> <xsl:if test="string-length($pText)"> <xsl:if test="not($pText=.)"> <br /> </xsl:if> <xsl:value-of select= "substring-before(concat($pText,';'),';')"/> <xsl:call-template name="split"> <xsl:with-param name="pText" select= "substring-after($pText, ';')"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet> 

当应用于这个XML文档时

 <t>123 Elm Street;PO Box 222;c/o James Jones</t> 

产生想要的,更正的结果

 123 Elm Street<br />PO Box 222<br />c/o James Jones 

II。 FXSL 1(用于XSLT 1.0):

这里我们只使用FXSL模板str-map (并且不必为第999次写recursion模板):

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:f="http://fxsl.sf.net/" xmlns:testmap="testmap" exclude-result-prefixes="xsl f testmap" > <xsl:import href="str-dvc-map.xsl"/> <testmap:testmap/> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="/"> <xsl:variable name="vTestMap" select="document('')/*/testmap:*[1]"/> <xsl:call-template name="str-map"> <xsl:with-param name="pFun" select="$vTestMap"/> <xsl:with-param name="pStr" select= "'123 Elm Street;PO Box 222;c/o James Jones'"/> </xsl:call-template> </xsl:template> <xsl:template name="replace" mode="f:FXSL" match="*[namespace-uri() = 'testmap']"> <xsl:param name="arg1"/> <xsl:choose> <xsl:when test="not($arg1=';')"> <xsl:value-of select="$arg1"/> </xsl:when> <xsl:otherwise><br /></xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> 

当这个转换应用于任何XML文档(未使用)时,会产生相同的想要的正确结果

 123 Elm Street<br/>PO Box 222<br/>c/o James Jones 

III。 使用XSLT 2.0

 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="text()"> <xsl:for-each select="tokenize(.,';')"> <xsl:sequence select="."/> <xsl:if test="not(position() eq last())"><br /></xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet> 

当这个转换应用于这个XML文档时

 <t>123 Elm Street;PO Box 222;c/o James Jones</t> 

想要的,正确的结果是

 123 Elm Street<br />PO Box 222<br />c/o James Jones 

如果您的XSLT处理器支持EXSLT ,则可以使用str:tokenize ,否则,链接包含使用substring-before之类函数的实现。