Solved

xquery - how to use a recurring value only once

Posted on 2008-10-26
3
370 Views
Last Modified: 2013-11-11
I have a XML like this

<root>
<records>
<action id="1" site="A" item="abs"/>
<action id="2" site="A" item="hgt"/>
<action id="3" site="A" item="98uuj"/>
</records>
</root>

I want to make it into this one, where the site attribute will only appear once.
must use XQuery ...

<actions>
<site>A</site>
<items>
<item>
<id>1</id>
<code>abs</code>
</item>
<item>
<id>2</id>
<code>hgt</code>
</item>
<item>
<id>3</id>
<code>98uuj</code>
</item>
</items>
</actions>

0
Comment
Question by:shalomc
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
3 Comments
 
LVL 60

Accepted Solution

by:
Geert Bormans earned 500 total points
ID: 22807208
mmh, it sounds like this is more a task for XSLT instead of XQuery, but here you go
let $doc := doc("file:///d:/untitled1.xml")
return
<actions>
    {
        for $a in distinct-values($doc//action/@site)
        return 
            <site>{$a}</site>
    }
    {
        for $a in distinct-values($doc//action/@site)
        return 
            <items>
                {
                for $b in $doc//action
                where $b/@site = $a
                return
                    <item>
                        <id>{string($b/@id)}</id>
                        <code>{string($b/@item)}</code>
                    </item>
                }
               </items>
    }
</actions>

Open in new window

0
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 22807221
in case you are interested, this is the XSLT you would need
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output indent="yes"/>
    <xsl:template match="records">
        <actions>
            <xsl:for-each-group select="action" group-by="@site">
                <site><xsl:value-of select="@site"/></site>
                <items>
                    <xsl:for-each select="current-group()">
                        <item>
                            <id><xsl:value-of select="@id"/></id>
                            <code><xsl:value-of select="@item"/></code>
                        </item>
                    </xsl:for-each>
                </items>
            </xsl:for-each-group>
        </actions>
    </xsl:template>
</xsl:stylesheet>

Open in new window

0
 
LVL 33

Author Comment

by:shalomc
ID: 22807500
the distinct-value had me going :)
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction In my previous article (http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/SSIS/A_9150-Loading-XML-Using-SSIS.html) I showed you how the XML Source component can be used to load XML files into a SQL Server database, us…
I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
There's a multitude of different network monitoring solutions out there, and you're probably wondering what makes NetCrunch so special. It's completely agentless, but does let you create an agent, if you desire. It offers powerful scalability …
Monitoring a network: why having a policy is the best policy? Michael Kulchisky, MCSE, MCSA, MCP, VTSP, VSP, CCSP outlines the enormous benefits of having a policy-based approach when monitoring medium and large networks. Software utilized in this v…

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question