问题描述
似乎 EXSLT 标记化功能不适用于 PHP XSLTProcessor (XSLT 1.0).
It seems like EXSLT tokenize function is not available with PHP XSLTProcessor (XSLT 1.0).
我尝试在纯 XSL 中实现它,但我无法使它工作:
I tried to implement it in pure XSL but I can't make it work :
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:func="http://exslt.org/functions"
xmlns:exsl="http://exslt.org/common"
xmlns:my="http://mydomain.com/">
<func:function name="my:tokenize">
<xsl:param name="string"/>
<xsl:param name="separator" select="'|'"/>
<xsl:variable name="item" select="substring-before(concat($string,$separator),$separator)"/>
<xsl:variable name="remainder" select="substring-after($string,$separator)"/>
<xsl:variable name="tokens">
<token><xsl:value-of select="$item"/></token>
<xsl:if test="$remainder!=''">
<xsl:copy-of select="my:tokenize($remainder,$separator)"/>
</xsl:if>
</xsl:variable>
<func:result select="exsl:node-set($tokens)"/>
</func:function>
<xsl:template match="/">
<xsl:copy-of select="my:tokenize('a|b|c')"/>
</xsl:template>
</xsl:stylesheet>
预期结果:
<token>a</token><token>b</token><token>c</token>
实际结果:
abc
我知道这个问题已经发布了很多次,但我找不到简单的解决方案.
I know this question has been posted many times but I can't find a simple solution.
感谢您的帮助.
推荐答案
引用 http://www.exslt.org/str/functions/tokenize/index.html
以下 XSLT 处理器支持 str:tokenize:
- 4XSLT,来自 4Suite.(版本 0.12.0a3)
- 来自 Daniel Veillard 等人的 libxslt.(版本 1.0.19)
由于 PHP 使用 libxslt,这意味着 tokenize
可用,但您必须使用正确的扩展名称空间(您不这样做):
Since PHP uses libxslt, it means tokenize
is available, but you have to use the right extension namespaces (which you dont do):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str"
…
然后你可以使用 tokenize 作为一个函数,例如构建一个数字为 1-12 的选择框:
Then you can use tokenize as a function, for example to build a select box with numbers 1-12:
<select name="months">
<xsl:for-each select="str:tokenize('1,2,3,4,5,6,7,8,9,10,11,12', ',')">
<xsl:element name="option">
<xsl:attribute name="value">
<xsl:value-of select="."/>
</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</select>
这篇关于如何实现 XSLT 标记化功能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!