|
Subject: Re: [xsl] Re: [xsl 1.0] howto merge branches by name From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx> Date: Wed, 14 Dec 2011 16:03:59 -0500 |
I am using XSL 1.0.
t:\ftemp>type adrian.xsl <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="test">
<test>
<xsl:variable name="suite" select="suite"/>
<xsl:for-each select="$suite">
<xsl:if test="generate-id(.)=
generate-id($suite[@name=current()/@name])">
<suite name="{@name}">
<xsl:variable name="case"
select="$suite[@name=current()/@name]/case"/>
<xsl:for-each select="$case">
<xsl:if test="generate-id(.)=
generate-id($case[@name=current()/@name])">
<case name="{@name}">
<xsl:copy-of select="$case[@name=current()/@name]/procedure"/>
</case>
</xsl:if>
</xsl:for-each>
</suite>
</xsl:if>
</xsl:for-each>
</test>
</xsl:template></xsl:stylesheet>
t:\ftemp>xslt adrian.xml adrian.xsl
<?xml version="1.0" encoding="utf-8"?>
<test>
<suite name="A">
<case name="A">
<procedure name="A"/>
<procedure name="B"/>
</case>
<case name="B">
<procedure name="A"/>
</case>
</suite>
</test>
t:\ftemp>type adrian.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0"><xsl:template match="test">
<test>
<xsl:variable name="suite" select="suite"/>
<xsl:for-each select="$suite">
<xsl:if test="generate-id(.)=
generate-id($suite[@name=current()/@name])">
<suite name="{@name}">
<xsl:variable name="case"
select="$suite[@name=current()/@name]/case"/>
<xsl:for-each select="$case">
<xsl:if test="generate-id(.)=
generate-id($case[@name=current()/@name])">
<case name="{@name}">
<xsl:copy-of select="$case[@name=current()/@name]/procedure"/>
</case>
</xsl:if>
</xsl:for-each>
</suite>
</xsl:if>
</xsl:for-each>
</test>
</xsl:template></xsl:stylesheet> t:\ftemp>
My last attempt to solve it this evening was: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="suites" match="//suite" use="@name" />
<xsl:key name="cases" match="//case" use="concat(../@name, '.', @name)" />
<xsl:template match="/"> <xsl:apply-templates /> </xsl:template>
<xsl:template match="test">
<test>
<xsl:for-each select="//suite">
<xsl:if test="generate-id() = generate-id(key('suites',@name)[1])">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:for-each>
</test> </xsl:template>
<xsl:template match="suite">
<suite name="{@name}">
<xsl:for-each select="//case">
<xsl:if test="generate-id() = generate-id(key('cases',concat(../@name, '.', @name))[1])">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:for-each>
</suite>
</xsl:template>
<xsl:template match="case"> <case name="{@name}" /> </xsl:template> </xsl:stylesheet>
which rendered duplicate cases :(
<?xml version="1.0" encoding="UTF-8"?> <test> <suite name="A"> <case name="A" /> <case name="B" /> <case name="B" /> </suite> <suite name="C"> <case name="A" /> <case name="B" /> <case name="B" /> </suite> </test>
-- Contact us for world-wide XML consulting and instructor-led training Free 5-hour video lecture: XSLT/XPath 1.0 & 2.0 http://ude.my/uoui9h Crane Softwrights Ltd. http://www.CraneSoftwrights.com/s/ G. Ken Holman mailto:gkholman@xxxxxxxxxxxxxxxxxxxx Google+ profile: https://plus.google.com/116832879756988317389/about Legal business disclaimers: http://www.CraneSoftwrights.com/legal
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] Re: [xsl 1.0] howto merge bra, Adrian Herscu | Thread | Re: [xsl] Re: [xsl 1.0] howto merge, G. Ken Holman |
| [xsl] Re: [xsl 1.0] howto merge bra, Adrian Herscu | Date | Re: [xsl] Re: [xsl 1.0] howto merge, G. Ken Holman |
| Month |