2014-02-05 75 views
0

分组Xpath的CONCAT重复的元素,这是我的第一个计算器问题:通过不同的属性

我有一个这样的XML文件:

<ROOT> 
<COLUMN ID="AA1"> 
    <CAPTION>Some Text 1</CAPTION> 
</COLUMN> 
<COLUMN ID="AA1"> 
    <CAPTION>Some Text 2</CAPTION> 
</COLUMN> 
<COLUMN ID="AA1"> 
    <CAPTION>Some Text 3</CAPTION> 
</COLUMN> 
<COLUMN ID="AA2"> 
    <CAPTION>Some Text 4</CAPTION> 
</COLUMN> 
<COLUMN ID="AA2"> 
    <CAPTION>Some Text 5</CAPTION> 
</COLUMN> 
</ROOT> 

,我希望它变换分析到这一点:

结果应该是所有列ID都被分组,并在每个组中将CAPTION连接起来

我不知道ID值,我不在乎它们。只是由他们分组。

这应该通过的结果,两个字符串在这种情况下:

“一些文本1的某些文本2的某些文本3”

“一些文本4的某些文本5”

这一切,使用Xpath2

我真的不知道,如果它只能使用XPath expession做,但我希望能......

有别人的想法?

+0

因此,在任何的答案有帮助?你有没有设法解决这个问题?请更新这个SO项目;也许你可以检查1个答案为'正确'... –

回答

0

使用

for $id in distinct-values(/ROOT/COLUMN/@ID) 
return string-join(/ROOT/COLUMN[@ID = $id]/CAPTION, ' ') 
0

进行分组,看看this answer。 您可以通过使用XSLT这样一个实现这一目标:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="yes"/> 
    <xsl:key name="id" match="COLUMN" use="@ID" /> 

    <xsl:template match="ROOT"> 
     <OUTPUT> 
      <xsl:apply-templates select="COLUMN[generate-id(.)=generate-id(key('id',@ID)[1])]" /> 
     </OUTPUT> 
    </xsl:template> 

    <xsl:template match="COLUMN"> 
     <xsl:element name="COLUMN"> 
      <xsl:attribute name="ID"> 
       <xsl:value-of select="@ID" /> 
      </xsl:attribute> 
      <xsl:for-each select="key('id', @ID)"> 
       <xsl:value-of select="CAPTION" /> 
       <xsl:text> </xsl:text> 
      </xsl:for-each> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

它会像这样的输出:

<OUTPUT> 
    <COLUMN ID="AA1">Some Text 1 Some Text 2 Some Text 3 </COLUMN> 
    <COLUMN ID="AA2">Some Text 4 Some Text 5</COLUMN> 
</OUTPUT>