XSLT, XPath: Как получить атрибут родительского элемента со ссылкой на атрибут его потомка? - PullRequest
0 голосов
/ 23 апреля 2019

Моя проблема очень сложная, и я не знал, как получить это в одном предложении-вопросе.Поэтому я пытаюсь объяснить: я работаю с коннектором (вы можете увидеть код ввода XML ниже).В качестве источника у меня есть атрибут (xmi: id) элемента «ведомый_элементом», который является дочерним элементом элемента «подгруппа», и этот элемент «подгруппа» имеет ссылку на другой элемент «группа / узел», и мне нужно получить атрибут этой группы элементов.

Пример XML-ввода :


<packagedElement>
    <group xmi:type="ActivityPartition" xmi:id="EAID_LIFELINE_1" name="Course manager">
        <node xmi:idref="EAID_SUBGROUP_1"/>
    </group>
    <subgroup xmi:type="LoopNode" xmi:id="EAID_SUBGROUP_1" name="Loop Node">
        <ownedBehavior xmi:type="Activity" xmi:id="EAID_ACTIVITY_1" name="for each course"/>
        <ownedBehavior xmi:type="Activity" xmi:id="EAID_ACTIVITY_2" name="getCourse"/>
        <containedEdge xmi:type="ControlFlow" xmi:id="EAID_CONNECTOR1" source="EAID_ACTIVITY_2" target="EAID_ACTIVITY_3"/>
    </subgroup>
    <group xmi:type="ActivityPartition" xmi:id="EAID_LIFELINE_2" name="Course">
        <node xmi:idref="EAID_ACTIVITY_3"/>
    </group>
    <packagedElement xmi:type="Activity" xmi:id="EAID_ACTIVITY_3" name="selectCourse"/>
</packagedElement>
...
<connectors>
    <connector xmi:idref="EAID_CONNECTOR1">
        <source xmi:idref="EAID_ACTIVITY_2"/>
        <target xmi:idref="EAID_ACTIVITY_3"/>
    </connector>
</connectors>
...

Но в выводе я просто хочу соединители с правильным источником и целевым, что это за некоторый элемент "группа" с атрибутом id (EAID_LIFELINE_1 или EAID_LIFELINE_2).Итак, xml output должен выглядеть следующим образом:

<connectors>
    <connector xmi:idref="EAID_CONNECTOR1">
        <source xmi:idref="EAID_LIFELINE_1"/>
        <target xmi:idref="EAID_LIFELINE_2"/>
    </connector>
</connectors>

Я пытался сделать это с помощью ключевой функции и this XSLT :

<xsl:key name="grp" match="group" use="node/@xmi:idref" />
<xsl:key name="subact" match="subgroup/ownedBehavior[@xmi:type='Activity']" use="@xmi:id" />
...
<connector xmi:idref="EAID_CONNECTOR{position()}">
     <source xmi:idref="{key('grp',../(key('subact',@source))/@xmi:id)/@xmi:id}"/> <!--This is place where I don´t know how to write that code to get to group...-->
     <target xmi:idref="{key('grp', @target)/@xmi:id}"/>
</connector>

Цель верна , она показывает, что я хочу (EAID_LIFELINE_2), но для источника Я не знаю, как написать этот xpath, чтобы получить спасательный круг .Не могли бы вы помочь мне кто-нибудь?Спасибо.

1 Ответ

2 голосов
/ 23 апреля 2019

Вам просто не хватало, чтобы подняться на один уровень от ownedBehavior до subgroup, чтобы получить право xmi:id. Поэтому измените ваш connector код на

<connector xmi:idref="EAID_CONNECTOR{position()}">
     <source xmi:idref="{key('grp',key('subact', @source)/../@xmi:id)/@xmi:id}"/> 
     <target xmi:idref="{key('grp', @target)/@xmi:id}"/>
</connector>

Вывод:

<connector xmlns:xmi="urn:abc" xmi:idref="EAID_CONNECTOR6">
    <source xmi:idref="EAID_LIFELINE_1"/>
    <target xmi:idref="EAID_LIFELINE_2"/>
</connector>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...