使用正则表达式解析字符串后创建并 return 一个节点列表

create and return a Nodelist after parsing a string with regex

我正在尝试创建一个 java 函数以在我的样式表中使用,该函数将根据正则表达式字符和 return 节点列表拆分字符串。

例如,我希望我的样式表是这样的:

<?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 代码中有这个函数,return 是一个字符串数组:

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

但我需要 return 是 NodeList 的东西,或者任何能正确格式化我的 XML 文件的东西。

我同意 Martin 的观点,最好在 XSLT 2.0.

中执行此操作

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

解决方案 #1

更改您的 Java 函数,使其 return 串联 令牌,"enveloped" 在 token 标签(开始和结束)之间。

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

(在每个</token>之后加上\n)。

return编辑的内容应该在打开和关闭之间写出来 标签。

解决方案 #2

如果您出于其他原因需要 node-set,您可以按如下方式进行:

stylesheet标签中包括:

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

您的拆分函数应该 return 一个连接的字符串(如上所述)。

然后在适当的地方写上:

<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 函数将 Result Tree Fragment 更改为 "proper" node-set 你可以使用例如在 XPath 中或以任何其他方式。