В XSLT, как мне получить доступ к значениям атрибутов двух узлов одного брата одновременно (при обращении к узлу a мне нужен доступ к узлу b)? - PullRequest
0 голосов
/ 29 ноября 2011

Как распечатать значения атрибутов всех узлов сообщений и линий жизни одновременно?
Под «сразу» я имею в виду, что при распечатке имени сообщения мне нужно получить доступ к узлам жизненного пути. Единственные атрибуты, которые меня беспокоят, это: спасательный круг / @ 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">. Конечно, я не могу получить доступ к атрибутам обоих узлов одновременно. Даже если я использую функцию шаблона вызова. Я попробовал, и это не удалось.

Это сложный вопрос, поэтому я ценю ваш ответ.

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

При for-each элементе lifeline вы можете использовать ../message для всех сообщений одного и того же ownedBehavior.Не уверен, какой из них выбрать, возможно, в той же позиции?

2 голосов
/ 29 ноября 2011

В общем случае используйте оператор объединения - | - для выбора обоих типов элементов в одном шаблоне:

<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> - предикат, выбирающий связанный узел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...