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之类函数的实现。