我有xml喜欢
<categories>
<category>
<LOC>USA,UK,Spain <LOC>
</category>
<category>
<LOC>India,USA,China <LOC>
</category>
<categories>
当我显示LOC
时,我不想让美国两次<xsl:value of select="$LOC/>
我在考虑使用一些变量
<xsl:variable name="ABC" select="set:distinct(//LOC)"/>
<xsl:value-of select="$ABC"/>
但它不起作用 知道可能是什么问题
编辑:对不起,我编辑了我的xml,我输错了答案 0 :(得分:4)
鉴于此XML
<?xml version="1.0" encoding="UTF-8"?>
<categories>
<category>
<LOC>USA,UK,Spain </LOC>
</category>
<category>
<LOC>India,USA,China </LOC>
</category>
</categories>
这是一个XSLT2样式表,可以执行您想要的任务
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:variable name="LOC">
<xsl:for-each select="//LOC/text()">
<xsl:for-each select="tokenize(current(),',')">
<temp><xsl:value-of select="current()"/></temp>
</xsl:for-each>
</xsl:for-each>
</xsl:variable>
<xsl:template match="/">
<xsl:value-of select="distinct-values($LOC/*)"/>
</xsl:template>
</xsl:stylesheet>
它首先构建一个临时树(文档片段),其中包含每个标记的一个元素,然后使用distinct-values()来删除重复项。我用Oxygen / XML编写并测试了它。
答案 1 :(得分:3)
EXSLT函数set:distinct
在节点集上运行。您传递给它的字符串不是节点集,因此该函数不起作用。或者更确切地说,它正在完美地工作,但你期待它的不合理。
首先,如果可以提供帮助,则不应将以逗号分隔的列表存储在XML中。 XML已经是一种分隔格式,因此您绝对没有理由在其中存储分隔格式。
如果你可以控制格式,你应该使用这样的东西:
<categories>
<category>
<LOC>USA</LOC>
<LOC>UK</LOC>
<LOC>Spain</LOC>
</category>
<category>
<LOC>India</LOC>
<LOC>USA</LOC>
<LOC>China</LOC>
</category>
</categories>
如果这是您输入的格式,set:distinct
会像您尝试使用它一样正常工作。
如果你没有对输入格式的这种控制,你会发现XSLT真的很糟糕的字符串操作和标记化(如果你有权访问XSLT 2会更有帮助,正如Jim Garrison在一篇文章中提到的那样)评论)。最好的办法是将XML读入其他结构并标记LOC
元素的内容并直接处理结果,而不是尝试在XSLT中执行。