XSLT,XPath:如何获取 parent 元素的属性并参考其 child 的属性?
XSLT, XPath: How to get attribute of parent element with reference on attribute of his child?
我的问题非常复杂,我不知道如何解决 sentence-question。所以我试着解释一下:我正在使用连接器(您可以在下面的代码 xml 输入中看到)。作为源,我有元素 "ownedBehavior" 的属性 (xmi:id),它是元素 "subgroup" 的 child 并且该元素 "subgroup" 在其他元素 "group/node" 中有引用,并且我需要获取该元素组的属性。
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)的某个元素 "group"。所以 xml output 应该是这样的:
<connectors>
<connector xmi:idref="EAID_CONNECTOR1">
<source xmi:idref="EAID_LIFELINE_1"/>
<target xmi:idref="EAID_LIFELINE_2"/>
</connector>
</connectors>
我尝试使用键函数和这个 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 来获取生命线。你能帮助我吗?谢谢。
您刚刚从 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>
我的问题非常复杂,我不知道如何解决 sentence-question。所以我试着解释一下:我正在使用连接器(您可以在下面的代码 xml 输入中看到)。作为源,我有元素 "ownedBehavior" 的属性 (xmi:id),它是元素 "subgroup" 的 child 并且该元素 "subgroup" 在其他元素 "group/node" 中有引用,并且我需要获取该元素组的属性。
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)的某个元素 "group"。所以 xml output 应该是这样的:
<connectors>
<connector xmi:idref="EAID_CONNECTOR1">
<source xmi:idref="EAID_LIFELINE_1"/>
<target xmi:idref="EAID_LIFELINE_2"/>
</connector>
</connectors>
我尝试使用键函数和这个 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 来获取生命线。你能帮助我吗?谢谢。
您刚刚从 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>