解析我的UML文件(XMI)时,我遇到了XSLT / XPath的问题。
以下表达式的行为有所不同($ thisId包含类的xmi:id,以检查它是否被'itechnical_Profile'中的构造型'revisioned'增强了):
1)
<xsl:value-of select="//*:revisioned[@base_Class = $thisId]/@xmi:id"/>
给了我正确的ID'_16_5_1_29f0058e_1359051179028_158208_16339application2'。
2)
<xsl:value-of select="//itechnical_Profile:revisioned[@base_Class = $thisId]/@xmi:id"/>
根本没有输出。
3)
<xsl:value-of select="/xmi:XMI/*:revisioned[@base_Class = $thisId]/@xmi:id"/>
给了我正确的ID'_16_5_1_29f0058e_1359051179028_158208_16339application2'。
我已经检查过
<xsl:value-of select="name(/xmi:XMI/*:revisioned[@base_Class = $thisId])"/>
节点名为'itechnical_Profile:revisioned'。
我还检查了
<xsl:value-of select="name(/xmi:XMI/*:revisioned[@base_Class = $thisId]/..)"/>
父节点名为'xmi:XMI'。
为什么2)失败?
使用构造型'UML_Standard_Profile:entity',它可以完美地工作。
我对'//'的理解是错误的吗?
提前致谢!
缩短XMI文件会有一些工作......所以经过一些调试后我得出了以下解决方法:
<xsl:function name="itechnical_uml:enhancedByStereotype_revisioned" as="xs:boolean">
<xsl:param name="packagedElementNode" as="element()"/>
<xsl:variable name="elementName" select="local-name($packagedElementNode)"/>
<xsl:if test="($elementName != 'packagedElement')">
<xsl:message terminate="yes">
Error: this is not a packagedElement!
</xsl:message>
</xsl:if>
<xsl:if test="($packagedElementNode/@xmi:type != 'uml:Class')">
<xsl:message terminate="yes">
<xsl:text>Error: this is a packagedElement but not with xmi:type = 'uml:Class'!
</xsl:text>
</xsl:message>
</xsl:if>
<xsl:variable name="thisId" select="$packagedElementNode/@xmi:id"/>
<xsl:variable name="stereotypeID">
<xsl:value-of select="root($packagedElementNode)//stereotype[@name = 'itechnical_Profile:revisioned']/@stereotypeID"/>
</xsl:variable>
<xsl:if test="$stereotypeID = ''">
<xsl:message terminate="yes">
<xsl:text>Error: unable to find xmi:id of stereotype 'itechnical_Profile:revisioned'!
</xsl:text>
</xsl:message>
</xsl:if>
<xsl:variable name="resultSet" as="element()*" select="root($packagedElementNode)/xmi:XMI/*:revisioned[@base_Class = $thisId]"/>
<xsl:choose>
<xsl:when test="$resultSet/@xmi:id != ''">
<xsl:value-of select="true()"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="false()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
检查UML XMI和我的XSLT脚本中的'xmlns:itechnical_Profile'定义没有出现任何问题。