在使用regex解析字符串后创建并返回Nodelist

时间:2017-03-20 14:40:42

标签: java regex xml xslt nodelist

我正在尝试在我的样式表中使用java函数,该函数表将基于正则表达式字符拆分字符串并返回NodeList。

例如,我希望我的样式表类似于:

<?xml version="1.0"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xalan="http://xml.apache.org/xalan"
    version="1.0">
    <xsl:template match="/">
        <Root>
            <xsl:copy-of select="re:splitRegex('This  is  my      string', '\s\s+')"/>
        </Root>
    </xsl:template>
</xsl:stylesheet>

我希望生成的XML看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:stash="xalan://com.nxtech.util.io.Stash">
    <token>This</token>
    <token>is</token>
    <token>my</token>
    <token>string</token>
</Root>

我的java代码中有这个函数,它返回一个字符串数组:

public static String[] split(String toSplit,String regex) {
    return toSplit.split(regex);
}

但是我需要一些返回NodeList的东西,或者正确格式化我的XML文件的东西。

1 个答案:

答案 0 :(得分:0)

我同意Martin的观点,最好在 XSLT 2.0 中进行。

但如果您更喜欢 Xalan / Java 方法,那么:

解决方案#1

更改您的Java函数,以便它返回连接 代币,&#34;包封&#34;在token个标签之间(开启和关闭)。

`<token>...</token>`

(在\n之后加</token>

返回的内容应该在开始和结束之间写出 Root 标记。

解决方案#2

如果由于其他原因需要node-set,您可以按照以下方式执行此操作:

stylesheet标记中包含:

xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl"

你的分裂函数应该返回一个连接的字符串(如上所述)。

然后,在适当的地方写:

<xsl:variable name="wrk">
  <xsl:value-of select="re:splitRegex('This  is  my      string', '\s\s+')"/>
</xsl:variable>
<xsl:variable name="tokens" select="exsl:node-set($wrk)"/>

node-set函数将结果树片段更改为&#34;适当的&#34; node-set 您可以使用,例如在XPath中或以任何其他方式。