首页 > 解决方案 > XSLT,XPath:如何通过引用他的孩子的属性来获取父元素的属性?

问题描述

我的问题非常复杂,我不知道如何解决一个句子问题。所以我试着解释一下:我正在使用连接器(你可以在下面的代码 xml 输入中看到)。作为源,我有元素“ownedBehavior”的属性(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 输出应该是这样的:

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

我尝试使用 key 函数和这个 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 来获取生命线。你能帮帮我吗?谢谢。

标签: xmlxsltxpathxslt-2.0xpath-2.0

解决方案


ownedBehavior你只是错过了从to上一层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>

推荐阅读