У меня есть идентификатор узла в другом месте в 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 имя группы.





Вы правы, когда спрашиваете об использовании ключ: это лучший способ разрешения перекрестных ссылок. Но вам не нужно «получать родительский атрибут элемента»: вы можете определить ключ для непосредственного нацеливания на родительский узел:
<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>
Вы хотите сопоставить
groupи использоватьnode/@xmi:idrefв своемxsl:key