xsl-list
[Top] [All Lists]

[xsl] Delete element except one child

2006-05-12 00:11:44
Hi All,

How can I do the following: 
If "UML:Package" has "xmi.idref" attribute then delete
its grand-Pa element bolck. Otherwise
delete "UML:Package" element except the children of
its child element "UML:Namespase.ownedElement"

Source:
...
<UML:Package xmi.id = '.:00000000000007CC' name =
'java' isSpecification = 'false'
          isRoot = 'false' isLeaf = 'false' isAbstract
= 'false'>
          <UML:Namespace.ownedElement>
            <UML:Package xmi.id = '.:00000000000007CB'
name = 'lang' isSpecification = 'false'
              isRoot = 'false' isLeaf = 'false'
isAbstract = 'false'>
              <UML:Namespace.ownedElement>
                <UML:Class xmi.id =
'.:000000000000085D' name = 'String' visibility =
'public'
                  isSpecification = 'false' isRoot =
'false' isLeaf = 'false' isAbstract = 'false'
                  isActive = 'false'>
                  <UML:ModelElement.taggedValue>
                    <UML:TaggedValue xmi.id =
'.:000000000000085E' isSpecification = 'false'>
                     
<UML:TaggedValue.dataValue>yes</UML:TaggedValue.dataValue>
                      <UML:TaggedValue.type>
                        <UML:TagDefinition xmi.idref =
'.:000000000000085F'/>
                      </UML:TaggedValue.type>
                    </UML:TaggedValue>
                  </UML:ModelElement.taggedValue>
                </UML:Class>
              </UML:Namespace.ownedElement>
            </UML:Package>

Target:
<UML:Class xmi.id = '.:000000000000085D' name =
'String' visibility = 'public'
                  isSpecification = 'false' isRoot =
'false' isLeaf = 'false' isAbstract = 'false'
                  isActive = 'false'>
                  <UML:ModelElement.taggedValue>
                    <UML:TaggedValue xmi.id =
'.:000000000000085E' isSpecification = 'false'>
                     
<UML:TaggedValue.dataValue>yes</UML:TaggedValue.dataValue>
                      <UML:TaggedValue.type>
                        <UML:TagDefinition xmi.idref =
'.:000000000000085F'/>
                      </UML:TaggedValue.type>
                    </UML:TaggedValue>
                  </UML:ModelElement.taggedValue>
                </UML:Class>

XSLT Code:
        <xsl:template match="*[name(descendant::*[2]) =
'UML:Package']">
                <xsl:choose>
                        <xsl:when
test="string-length(descendant::UML:Package/@xmi.idref)
&gt; 0"/>
                </xsl:choose>
        </xsl:template>

        <xsl:template match="UML:Package">
                <xsl:copy>
                        <xsl:copy-of
select="UML:Namespace.ownedElement/@*"/>
                </xsl:copy>
        </xsl:template>

Full XSLT Code:
<?xml version='1.0' ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
        xmlns:UML="org.omg.xmi.namespace.UML"
xmlns:a="http://graphml.graphdrawing.org/xmlns/graphml";>
        <xsl:output method="xml"/>
        <xsl:template match="/">
                <xsl:copy>
                        <xsl:copy-of select="@*"/>
                        <xsl:apply-templates/>
                </xsl:copy>
        </xsl:template> 
        <xsl:template match="*">
                <xsl:copy>
                        <xsl:copy-of select="@*"/>
                        <xsl:apply-templates/>
                </xsl:copy>
        </xsl:template>
        <xsl:template
match="UML:Namespace.ownedElement[local-name(parent::*[1])
= 'Model']">
                <xsl:element name="UML:Namespace.ownedElement">
                        <xsl:call-template name="graphml"/>
                        <xsl:copy>
                                <xsl:copy-of select="@*"/>
                                <xsl:apply-templates/>
                        </xsl:copy>                     
                        <!--<xsl:copy-of
select="descendant::UML:Namespace.ownedElement/*"/>
                        <xsl:call-template name="package"/> -->
                </xsl:element>
        </xsl:template>
        <xsl:template name="graphml">
                <xsl:for-each select="//a:graphml/.//a:cluster">
                        <xsl:choose>
                                <xsl:when test="count(child::*) &gt; 1">
                                <xsl:variable name="cOne"
select="child::*[1]/@name"/>
                                <xsl:variable name="cTwo"
select="child::*[2]/@name"/>
                                <xsl:if test="not((count(child::*) = '2') and
((contains($cOne, '.java') and contains($cOne, $cTwo))
or (contains($cTwo, '.java') and contains($cTwo,
$cOne))))">
                                        <xsl:element name="UML:Component">
                                                <xsl:attribute name="xmi.id">
                                                        
<xsl:text>.:000</xsl:text>
                                                        <xsl:value-of 
select="@id"/>
                                                </xsl:attribute>
                                                <xsl:attribute
name="isSpecification">false</xsl:attribute>
                                                <xsl:attribute
name="isRoot">false</xsl:attribute>
                                                <xsl:attribute
name="isLeaf">false</xsl:attribute>
                                                <xsl:attribute
name="isAbstract">false</xsl:attribute>
                                                <xsl:copy-of select="@name"/>
                                                <xsl:element
name="UML:ModelElement.clientDependency">
                                                        <xsl:for-each 
select="a:node">
                                                                <xsl:element 
name="UML:Dependency">
                                                                        
<xsl:attribute name="xmi.idref">
                                                                                
<xsl:value-of select="@xmi.id"/>
                                                                        
</xsl:attribute>
                                                                        
<xsl:apply-templates/>
                                                                </xsl:element>
                                                        </xsl:for-each>
                                                </xsl:element>
                                        </xsl:element>
                                </xsl:if>
                                </xsl:when>
                        </xsl:choose>
                </xsl:for-each>
        </xsl:template>

        <xsl:template match="*[name(descendant::*[2]) =
'UML:Package']">
                <xsl:choose>
                        <xsl:when
test="string-length(descendant::UML:Package/@xmi.idref)
&gt; 0"/>
                </xsl:choose>
        </xsl:template>

        <xsl:template match="UML:Package">
                <xsl:copy>
                        <xsl:copy-of
select="UML:Namespace.ownedElement/@*"/>
                </xsl:copy>
        </xsl:template>

        <xsl:template match="a:graphml"/>
</xsl:stylesheet>

Thanks in Advance,
Hind


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>