我必须使用XSLT
从单个节点中排除重复值离。
<?xml version="1.0" encoding="UTF-8" ?>
<base>
<string>test1,test2,test3,test1,test4,test2,test5,</string>
</base>
结果应如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<base>
string>test1,test2,test3,test4,test5,</string>
</base>
有人可以帮我这个吗?
答案 0 :(得分:0)
如果您尝试在XSLT 1.0中执行此操作,您应该可以执行此类xsl: how to split strings?之类的操作,如果处理器支持加载结果,则可能使用document()
函数将其添加到文档中然后使用xsl:key
来获得不同的结果。虽然这很复杂。这是另一种使用纯XSLT 1.0避免某些卷积的方法:https://stackoverflow.com/a/34944992/3016153。
我的偏好仍然是为了某种延伸;如果您使用MSXML执行此操作,则可以执行以下操作(我可能更喜欢C#,但如果您不使用MSXML,则JavaScript可能更具可移植性):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="http://mycompany.com/mynamespace">
<xsl:template match="/base/string">
<xsl:value-of select="user:distinctSplit(string(.))" />
</xsl:template>
<msxsl:script language="JScript" implements-prefix="user">
function distinctSplit(str) {
var u = {}, a = [];
var splt = str.split(',');
for(var i = 0;i < splt.length;i++) {
if (u.hasOwnProperty(splt[i])) {
continue;
}
a.push(splt[i]);
u[splt[i]] = 1;
}
return a.join(',');
}
</msxsl:script>
</xsl:stylesheet>
如果你没有使用MSXML,你可能会获得一个tokenize扩展或使用你的处理器嵌入JavaScript的方法(你的处理器甚至可能支持数组的.filter()
函数,这可能会产生这个代码更简单 - 使用MSXML进行本地测试不支持filter()
。)
如果你正在使用XSLT 2.0,你可以使用tokenize
和distinct-values
,这样的事情应该有效:
<xsl:for-each select="distinct-values(tokenize(/base/string, ','))" separator=",">
<xsl:value-of select="concat(., ',')" />
</xsl:for-each>
但是您可能需要稍微玩一下,因为它可能会添加您最不想要的额外,
文字。