XSLT: Как получить родительский атрибут элемента + с помощью key () - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть некоторый идентификатор узла в другом месте в XML, и я хочу получить имя родителя этого узла.Вероятно, мне следует использовать также key (), но я не знаю, как это сделать.

Более подробно: как вы можете видеть в коде ниже, у меня есть "uml: Model" и "xmi: Extension".В uml: Extension есть коннектор, который имеет ссылку на источник и цель на узел в группе элементов.Я хочу знать, в какой группе (uml: Model / packagedElement / packageElement / group) этот источник или цель в качестве узла.

<uml:Model xmi:type="uml:Model" name="EA_Model" visibility="public">
        <packagedElement xmi:type="uml:Package">
            <packagedElement xmi:type="uml:Activity">
                <group xmi:type="uml:ActivityPartition" xmi:id="EAID_BF8E059A_4010_4630_BB60_72A722391509" name="Course">
                    <node xmi:idref="EAID_4E2127CA_F6AD_4898_B2B8_24F0878B557D"/>
                </group>
                <packagedElement xmi:type="uml:Activity" xmi:id="EAID_4E2127CA_F6AD_4898_B2B8_24F0878B557D" name="selectCourse"/>
                <group xmi:type="uml:ActivityPartition" xmi:id="EAID_638BBC87_3987_4c8e_B910_A67FDFF25ABE" name="Course manager" >
                    <node xmi:idref="EAID_61782877_58D5_41e6_B4BA_3C79CC4ADCFF"/>
                </group>
                <packagedElement xmi:type="uml:Activity" xmi:id="EAID_61782877_58D5_41e6_B4BA_3C79CC4ADCFF" name="select driving school"/>
            </packagedElement>
        </packagedElement>
</uml:Model>
<xmi:Extension extender="Enterprise Architect" extenderID="6.5">
        <connectors>
            <connector xmi:idref="EAID_C43E5114_A121_4a58_948C_3F7865CDDE19">
                <source xmi:idref="EAID_61782877_58D5_41e6_B4BA_3C79CC4ADCFF"/>
                <target xmi:idref="EAID_4E2127CA_F6AD_4898_B2B8_24F0878B557D"/>
            </connector>
        </connectors>
</xmi:Extension>

Я хочу использовать аналогичный XSLT:

<xsl:template match="xmi:Extension/connectors">
        <xsl:element name="connectors">
           <xsl:for-each select="connector">
               <connector xmi:idref="{@xmi:idref}">
              <source xmi:idref="  <!--{group/@name}  based on node-->  "/>
              <target xmi:idref="  <!--{group/@name}  based on node-->  "/>
        </xsl:element>
     </xsl:template>

Для этого ввода я ожидаю такой вывод XML:

<connector xmi:idref="EAID_C43E5114_A121_4a58_948C_3F7865CDDE19">
                <source xmi:idref="Course Manager"/>
                <target xmi:idref="Course"/>
</connector>

Таким образом, источник и цель будут иметь вxmi: idref, название группы.

1 Ответ

1 голос
/ 16 апреля 2019

Вы вправе спросить об использовании клавиши : это лучший способ разрешить перекрестные ссылки. Но вам не нужно «получать атрибут родительского элемента»: вы можете определить ключ для непосредственного нацеливания на родительский узел:

<xsl:key name="grp" match="group" use="node/@xmi:idref" />

тогда просто:

<xsl:template match="xmi:Extension/connectors">
    <connectors>
        <xsl:for-each select="connector">
            <connector xmi:idref="{@xmi:idref}">
                <source xmi:idref="{key('grp', source/@xmi:idref)/@name}"/>
                <target xmi:idref="{key('grp', target/@xmi:idref)/@name}"/>         
            </connector>
        </xsl:for-each>
    </connectors>
</xsl:template>

Демо : https://xsltfiddle.liberty -development.net / ncdD7mA

...