xml - XSLT:如何获取元素父属性 + 使用 key()
问题描述
我在 xml 的不同位置有一些节点 ID,我想获取该节点的父节点的名称。可能我也应该使用 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 中具有组名。
解决方案
您问使用key是对的:这是解决交叉引用的最佳方法。但是你不需要“获取元素父属性”:你可以直接定义key来定位父节点:
<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>
推荐阅读
- sql - 查询 Oracle 11g 中的 TABLE ACCESS (FULL) 问题
- symfony4 - 如何在属性字段中显示字符串而不是数据库中的整数?
- python - 过滤来自 Spotipy API 调用的结果
- java - 我无法为 viewPager2 调用 FragmentStateAdapter 中的 instantiateItem 元素
- node.js - 如何将strapis默认的所见即所得编辑器替换为CKEditor
- javascript - 如果在 Gatsby 中使用标签而不是使用 GatsbyLinks,会发生什么情况?
- excel - VBA粘贴为值并遍历特定工作表
- selenium-webdriver - 我需要在 appium-Python 中使用 WebDriverWait,并且需要将“ios_predicate”作为定位器传递
- python - Django静态文件在collectstatic后解析
- javascript - 覆盖 Map.get 方法