2011-11-29 25 views
0

如何一次打印所有消息和生命线节点的属性值?
“一次”是指在打印出消息名称时,我需要访问生命线节点。我关心的唯一属性是:生命线/ @名称和消息/ @名称。我试图打印出消息名称,消息的名称来自消息。你不需要发布答案来解决我如何将消息与其开始和结束的生命线联系起来。这很棘手。我只需要知道如何一次访问生命线和消息属性值。或者如果它甚至可能。 XSLT显示输出格式。在XSLT中,如何一次访问两个兄弟节点的属性值(在访问节点a时,我需要访问节点b)?

对于以下XML,只关注生命线,消息和packagedElement节点。对于上下文来说,XML是具有序列图的UML模型。保留序列消息的顺序不是必需的。我正在开发客户端,因此样式表href行包含在XML中。我无法改变样式表href以外的XML。所有需要的命名空间都包含在内。我正在将XML转换为文本。我想打印出这些值作为制表符分隔的文本。

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet href="multiple nonthreaded iers.xsl" type="text/xsl"?> 
<uml:Model xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/3.0.0/UML" xmi:id="idModel" name="main"> 
    <packagedElement xmi:type="uml:Package" xmi:id="idPackage" name="ThreadedIERPackage"> 
    <packagedElement xmi:type="uml:Collaboration" xmi:id="idCollaboration" name="ThreadedIERCollaboration"> 
     <ownedBehavior xmi:type="uml:Interaction" xmi:id="idInteraction"> 
     <lifeline xmi:type="uml:Lifeline" xmi:id="_OccJQguaEeGMo_zLRqy_vg" name="Lifeline1"/> 
     <lifeline xmi:type="uml:Lifeline" xmi:id="_Oo87QguaEeGMo_zLRqy_vg" name="Lifeline2" coveredBy="_QrWQ2AuaEeGMo_zLRqy_vg _R4-hlQuaEeGMo_zLRqy_vg _QrWQ0guaEeGMo_zLRqy_vg"/><!-- can ignore the last id --> 
     <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_R4-hlQuaEeGMo_zLRqy_vg" name="MessageOccurrenceSpecification2" covered="_Oo87QguaEeGMo_zLRqy_vg" event="_R4-hlguaEeGMo_zLRqy_vg" message="_R4-hlwuaEeGMo_zLRqy_vg"/> 
     <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_QrWQ2AuaEeGMo_zLRqy_vg" name="MessageOccurrenceSpecification1" covered="_Oo87QguaEeGMo_zLRqy_vg" event="_QrWQ2QuaEeGMo_zLRqy_vg" message="_QrWQ2guaEeGMo_zLRqy_vg"/> 
     <fragment xmi:type="uml:BehaviorExecutionSpecification" xmi:id="_QrWQ0guaEeGMo_zLRqy_vg" name="BehaviorExecutionSpecification1" covered="_Oo87QguaEeGMo_zLRqy_vg" start="_QrWQ2AuaEeGMo_zLRqy_vg" finish="_R4-hlQuaEeGMo_zLRqy_vg"/> 
     <message xmi:type="uml:Message" xmi:id="_QrWQ2guaEeGMo_zLRqy_vg" name="Message1" receiveEvent="_QrWQ2AuaEeGMo_zLRqy_vg"/> 
     <message xmi:type="uml:Message" xmi:id="_R4-hlwuaEeGMo_zLRqy_vg" name="Message2" messageSort="reply" sendEvent="_R4-hlQuaEeGMo_zLRqy_vg"/> 
     </ownedBehavior> 
    </packagedElement> 
    <packagedElement xmi:type="uml:CallEvent" xmi:id="_QrWQ2QuaEeGMo_zLRqy_vg" name="CallEvent1"/> 
    <packagedElement xmi:type="uml:CallEvent" xmi:id="_R4-hlguaEeGMo_zLRqy_vg" name="CallEvent2"/> 
    </packagedElement> 
    <profileApplication xmi:type="uml:ProfileApplication" xmi:id="idProfileApplication"> 
    <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="idProfileAnnotation" source="http://www.eclipse.org/uml2/2.0.0/UML"> 
     <references xmi:type="ecore:EPackage" href="pathmap://SysMLActivityExtensionsProfile.uml#ProfileContentId"/> 
    </eAnnotations> 
    <appliedProfile xmi:type="uml:Profile" href="pathmap://SysMLActivityExtensionsProfile.uml#ActivityProfileId"/> 
    </profileApplication> 
</uml:Model> 

XSLT:

<xsl:template match="/"> 
<xsl:text>#Sending Lifeline (Producer)</xsl:text> 
<xsl:value-of select="$tab"/> 

<xsl:text>Receiving Lifeline (Consumers)</xsl:text> 
<xsl:value-of select="$tab"/> 

<xsl:text>Name(s)</xsl:text> 
<xsl:value-of select="$tab"/> 
<xsl:text>ID</xsl:text> 
    <xsl:value-of select="$tab"/> 
<xsl:value-of select="$newline"/> 
<xsl:apply-templates /> 

</xsl:template> 


<xsl:template match="packagedElement/ownedBehavior"> 
<xsl:for-each select="lifeline"><!-- prints all lifelines--> 
    <xsl:value-of select="@name"/><xsl:text>.OE</xsl:text> 
    <xsl:value-of select="$tab"/> 
</xsl:for-each> 

    <xsl:text>OE --> OE</xsl:text> 
    <xsl:value-of select="$tab"/> 

    <xsl:value-of select="message/@name"/> 
    <xsl:value-of select="$tab"/> 
</xsl:template> 

</xsl:stylesheet> 

我曾尝试: 我创建了一个packagedElement/ownedBehavior模板来访问节点(生命线,消息),因为他们都是孩子。但是,除非我使用for -ach,否则它不会打印出所有消息或生命线。但是,如果我使用for-each,那么我只能访问消息或生命线,而不是两者。

我试过使用多个模板,即一个用于生命线,另一个用于消息。例如:<xsl:template match="lifeline">。当然,我不能一次访问两个节点的属性。即使如果我使用呼叫模板功能。我已经尝试过了,失败了。

这是一个棘手的问题,所以我感谢您的回复。

回答

2

一般情况下,使用union运算符 - | - 在一个模板来选择这两种类型的元素:

<xsl:template match="lifeline|message"> 

或者:

<xsl:template match="packagedElement/ownedBehavior"> 
    <xsl:for-each select="lifeline|message"> 
     <!-- code here --> 
    </xsl:for-each> 
</xsl:template> 

另外,遍历一个或另一个,随时随地联系。例如:

<xsl:template match="packagedElement/ownedBehavior"> 
    <xsl:for-each select="lifeline"> 
     <xsl:value-of select="../message[<some_condition_here>]"/> 
     <!-- code here --> 
    </xsl:for-each> 
</xsl:template> 

...其中<some_condition_here>是谓词选择所述相关联的节点。

+0

谢谢,你已经帮了我。 – user1060538

2

虽然for-each ing lifeline元素,你可以使用../message所有消息相同的ownedBehavior。不知道你应该选择哪一个,相同的位置可能?

+0

是的,我在你发布的时候把这个添加到我的答案中。这可能是需要的。 –

+0

谢谢这有助于。 – user1060538