Как распечатать значения атрибутов всех узлов сообщений и линий жизни одновременно?
Под «сразу» я имею в виду, что при распечатке имени сообщения мне нужно получить доступ к узлам жизненного пути. Единственные атрибуты, которые меня беспокоят, это: спасательный круг / @ name и message / @ name. Я пытаюсь распечатать имена сообщений с именем спасательного круга, из которого оно перемещается. Вам не нужно публиковать ответ, чтобы решить, как я буду связывать сообщение с его начальной и конечной линиями жизни. Это сложно. Мне просто нужно знать, как получить доступ к значениям атрибутов линии жизни и сообщения сразу. Или, если это вообще возможно. XSLT показывает формат вывода.
Для следующего XML просто сконцентрируйтесь на узлах жизненного пути, сообщения и packagedElement. Для контекста XML представляет собой модель UML с диаграммой последовательности. Сохранять порядок следования сообщений не обязательно. Я занимаюсь разработкой на стороне клиента, поэтому в таблицу включена строка 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:
& # ха;
& # X09;
<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 / ownBehavior для доступа к обоим узлам (линия жизни, сообщение), так как они оба дочерние. Тем не менее, он не распечатывает все сообщения или линии жизни, если я не использую for -each. Но если я использую для каждого, то я могу получить доступ только к сообщениям или каналам жизни, а не к обоим.
Я пытался использовать несколько шаблонов, то есть один для линии жизни, а другой для сообщения. Пример: <xsl:template match="lifeline">
. Конечно, я не могу получить доступ к атрибутам обоих узлов одновременно. Даже если я использую функцию шаблона вызова. Я попробовал, и это не удалось.
Это сложный вопрос, поэтому я ценю ваш ответ.