XMI文件中的UML构造型的XPath寻址

时间:2014-02-06 13:26:03

标签: xslt xpath uml stereotype

解析我的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'!&#xa;</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'!&#xa;</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'定义没有出现任何问题。

0 个答案:

没有答案