This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Processing directed acyclic graph (DAG) for object inheritance in XSLT


Dear XSLT experts,

Please refer to XML and XSLT files. I would like to process all <Attribute>
of a <Class>
by the following:

A. First get all attributes as defined in the class
B. Get all <Base> for a given <Class>, remove duplicates
C. Get attributes of <Base> class for all in step B.

Please take a look at XML file to know what I mean by <Class>, <Base>,
<Attribute>.

As you can see, I am trying to process in XSLT the directed acyclic graph
(DAG) for object inheritance
in my object model. I am able to do step A, B. I am failing to step C.
Please show me a way to do step C.
For example the <Class> TestClass should have <Attribute> from:

TestClass (self)
Base class Shelf
Base class Device
Base class MOBase
Base class ManagedElement
Base class Switch
Base class Card
Base class Slot

Thanks,
Soumen.

XML file
========
<?xml version='1.0'?>

<!--This file contains the Data definition to be used for AppDirector. -->

<DataRoot version = 'x.y.z'>

<ManagedObject>

<!--**************************** TestClass ****************************-->
  <Class name="TestClass" classid='99999' abstract='BooleanEnum.FALSE'>
  <Base name="Shelf"/>
  <Base name="Device"/>
  <Base name="Card"/>
  <Base name="Slot"/>
  </Class>

<!--**************************** MOBase ****************************-->
  <Class name='MOBase' classid='1' abstract='BooleanEnum.TRUE' >

  <Attribute name='name' type='DN' access='AccessEnum.RC'
attrlocation='AttrLocationEnum.NMS'/>
  <Attribute name='userLabel' type='String' default='Not Assigned'/>
  <Attribute name='uniqueID' type='Integer' access='AccessEnum.RC'/>
  <Attribute name='parentID' type='Integer'/>
  <Attribute name='parentType' type='Integer'/>
  </Class>

<!--**************************** ManagedElement
****************************-->
  <Class name='ManagedElement' classid='2' abstract='BooleanEnum.TRUE' >
  <Attribute name='location' type='String'/>
  <Attribute name='version' type='String'/>
  <Attribute name='managedElementType'  type='ManagedElementTypeEnum' />
  <Attribute name='communicationState'  type='CommunicationStateEnum'
default='CommunicationStateEnum.CS_AVAILABLE'/>
  <Attribute name='managedElementInfo' type='String' />
  </Class>

<!--**************************** Equipment ****************************-->
  <Class name='Equipment' classid='3' abstract='BooleanEnum.TRUE' >

  <Attribute name='nativeEMSName' type='String' />
  <Attribute name='equipmentObjectType' />
  <Attribute name='alarmMonitoringIndicator' type='Boolean' default='FALSE'
attrlocation='AttrLocationEnum.NMS'/>
  <Attribute name='serviceState'  type='ServiceStateEnum' access='RO' />
  <Attribute name='partNumber' type='String' access='AccessEnum.RO' />
  <Attribute name='version' type='String' access='AccessEnum.RO' />
  <Attribute name='serialNumber' type='String' access='AccessEnum.RO' />
  <Attribute name='equipmentInfo' type='String' access='AccessEnum.RO'/>
  </Class>

<!--**************************** EquipmentHolder
****************************-->
  <Class name='EquipmentHolder' classid='4' abstract='BooleanEnum.TRUE' >

  <Attribute name='nativeEMSName' type='String' access='AccessEnum.RW' />
  <Attribute name='holderType' type='String' access='AccessEnum.RO' />
  <Attribute name='installedEquipment' type='DN' access='AccessEnum.RW' />
  <Attribute name='acceptableEquipmentTypeList' type='Collection(String)'
access='AccessEnum.RO'/>
  <Attribute name='holderState' type='HolderStateEnum'
default='HolderStateEnum.EMPTY'/>
  </Class>

<!--**************************** SwitchHolder
****************************-->
  <Class name='Switch' classid='8' abstract='BooleanEnum.TRUE'
beangen='BooleanEnum.TRUE'>

  <Attribute name='switchA1' type='String' access='AccessEnum.RW' />
  <Attribute name='switchA2' type='String' access='AccessEnum.RW' />
  </Class>

<!--**************************** Network ****************************-->
  <Class name='Network' classid='5' abstract='BooleanEnum.FALSE'
beangen='BooleanEnum.TRUE'>
  <Base name='MOBase'/>
  </Class>

<!--**************************** Subnetwork ****************************-->
  <Class name='Subnetwork' classid='6' abstract='BooleanEnum.FALSE'
beangen='BooleanEnum.TRUE'>
  <Base name='MOBase'/>
  <Parent>Network</Parent>
  </Class>

<!--**************************** Device ****************************-->
  <Class name='Device' classid='7' abstract='BooleanEnum.FALSE'
beangen='BooleanEnum.TRUE'>
  <Base name='MOBase'/>
  <Base name='ManagedElement'/>
  <Base name='Switch'/>
  <ImplementBase name='Switch'
package='com.atoga.appdirector.server.managedobject.switch' />
  <Parent>Network</Parent>

  <Attribute name='deviceType'  type='DeviceTypeEnum' access='AccessEnum.RC'
/>
  <Attribute name='managementIpaddress' type='String' access='AccessEnum.RC'
/>
  <Attribute name='description' type='String' />
  <Attribute name='manufacturerName' default='Atoga Systems Inc.'/>
  <Attribute name='model' type='String' access='AccessEnum.RW'
attrlocation='AttrLocationEnum.NMS'/>
  <Attribute name='serialNumber' type='String' />
  <Attribute name='bandwidthCapacity' type='Integer' />
  <Attribute name='bandwidthAvailable' type='Integer'
attrlocation='AttrLocationEnum.BOTH' snmpoid='1.2.3.4.5.6'/>
  <Attribute name='minimumGuaranteedBwUnit' type='String' default='64Kbps'
attrlocation='AttrLocationEnum.BOTH'  snmpoid='1.2.3.4.5.6' persistencesize
= '48'/>
  <Attribute name='burstableGuaranteedBwUnit' type='String'
default='64Bytes' attrlocation='AttrLocationEnum.BOTH'
snmpoid='1.2.3.4.5.6'/>
  <Attribute name='maximumBurstSizeUnit' type='String' default='64Kbps'
attrlocation='AttrLocationEnum.BOTH' snmpoid='1.2.3.4.5.6'/>
  </Class>

</ManagedObject>

</DataRoot>

XSLT file
=========
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"
omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="DataRoot/ManagedObject/Class">
Managed object name is <xsl:value-of select="@name"/>
Attributes from this class are:
<xsl:for-each select="./Attribute">
Attribute: <xsl:value-of select="@name"/>
</xsl:for-each>
<!-- The variable TempBase will have all the Base Nodes for a given Class
(with the repeatativeness) -->
<xsl:variable name="TempBase">
<xsl:call-template name="findAllBaseClasses">
<xsl:with-param name="className" select="@name"/>
</xsl:call-template>
</xsl:variable>
<xsl:for-each select="$TempBase/Base">
<xsl:if test="not(./@name=preceding::node()/@name)">
Base class is <xsl:value-of select="@name"/>
Attributes from this class are:
<xsl:call-template name="findAttributes">
<xsl:with-param name="className" select="@name"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:template>

<xsl:template name="findAllBaseClasses">
<xsl:param name="className"/>
<xsl:for-each select="//Class[@name=$className]/Base">
Copying <xsl:value-of select="@name"/>
<xsl:copy-of select="."/>
<xsl:call-template name="findAllBaseClasses">
<xsl:with-param name="className" select="@name"/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>

<xsl:template name="findAttributes">
<xsl:param name="className"/>
In findAttributes(<xsl:value-of select="$className"/>)
<xsl:for-each select="//Class[@name=$className]/Attribute">
<xsl:value-of select="@name"/>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]