2012-08-02 66 views
1

请原谅我以前的类似帖子。希望我可以从很好的反馈中学习,但仍然在XPath中挣扎。我再次为类似的帖子感到抱歉!xsl转换 - 删除重复

当前XML

<?xml version="1.0" encoding="utf-8" ?> 
<data> 
    <table_1 dropdown1="Item1"></table_1> 
    <listitems key1="Item1" name="" key2="Id2"/> 
    <listitems key1="Item1" name="Item A" key2="Id2"/> 
    <listitems key1="Item1" name="Item B" key2="Id2"/> 
    <listitems key1="Item1" name="" key2="Id4"/> 
    <listitems key1="Item1" name="Item A" key2="Id4"/> 
    <listitems key1="Item1" name="Item B" key2="Id4"/> 
    <listitems key1="Item2" name="" key2="Id6"/> 
    <listitems key1="Item2" name="Item C" key2="Id6"/> 
    <listitems key1="Item2" name="Item D" key2="Id6"/> 
</data> 

当前XSL

<xsl:template match="/"> 
    <html> 
     <head> 
      <title>Untitled</title> 
     </head> 
     <body> 
      <xsl:for-each select="/data/listitems[@key1=/data/table_1/@dropdown1]"> 
       <xsl:value-of select="@name"/>      
       <br/> 
      </xsl:for-each> 

     </body> 
    </html> 
</xsl:template> 

<xsl:template match="listitems"> 
    <xsl:value-of select="concat(@name, ' ')" /> 
</xsl:template> 

当前结果:

enter image description here

+0

棒,你没有给我们一些非常重要的东西 - 请提供转换的确切想要的结果。这可能有助于读者了解需要哪些分组 - 除非您还指定了分组的要求。记住一个基本原则:不要让读者猜测实际需要什么。请。 – 2012-08-03 01:53:47

+0

你是否应该让你第一个6'listitem'元素全部用'key1 =“Item1”'?你的代码不会重复任何事情,项目A和项目B都存在两次,并且都具有相同的'key1'值。 – Flynn1179 2012-08-03 06:23:40

+0

@DimitreNovatchev我试图获得的唯一值将填充一个下拉列表。我使用名称属性值作为下拉列表的项目。 – Rod 2012-08-03 13:05:42

回答

1

假设你考虑<listitems>元素具有相同name属性为重复,您可以使用XPath的preceding-sibling轴忽略是重复的所有元素:

<xsl:for-each select="/data/listitems[@key1=/data/table_1/@dropdown1][not(@name = preceding-sibling::listitems/@name)]"> 

这意味着,你选择你所选择的项目,附加限制是不存在任何先前的<listitems>兄弟元素,其name属性具有与被测试的元素相同的值。

+0

我试着用你的每条线代替我,但我仍然得到重复。难道我做错了什么? – Rod 2012-08-02 21:06:09

+1

@rod:对不起,这太复杂了,包含一个错字;我编辑了我的答案并测试了新版本;现在我跳过任何重复项。 – 2012-08-02 21:46:23

+0

非常感谢您的帮助 – Rod 2012-08-03 13:14:18