如何使用xslt从单个xml节点中排除重复值

时间:2017-01-17 14:12:47

标签: xml xslt duplicates

我必须使用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>

有人可以帮我这个吗?

1 个答案:

答案 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 &lt; 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,你可以使用tokenizedistinct-values,这样的事情应该有效:

<xsl:for-each select="distinct-values(tokenize(/base/string, ','))" separator=",">
  <xsl:value-of select="concat(., ',')" />
</xsl:for-each>

但是您可能需要稍微玩一下,因为它可能会添加您最不想要的额外,文字。