xml使用xsl的不同值

时间:2010-01-04 17:48:08

标签: xml xslt

我有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,我输错了

2 个答案:

答案 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中执行。