XSLT选择 - 测试属性值

时间:2015-10-20 13:40:24

标签: xslt

我正在使用Choose语句和相应的Test-Clause。

如果有以下XML(只是一个摘录),它表示来自Enterprise Architect的数据模型导出作为XMI:

<xmi:XMI xmi:version="2.1" xmlns:uml="http://schema.omg.org/spec/UML/2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmlns:thecustomprofile="http://www.sparxsystems.com/profiles/thecustomprofile/1.0" xmlns:EAUML="http://www.sparxsystems.com/profiles/EAUML/1.0">       <xmi:Documentation exporter="Enterprise Architect" exporterVersion="6.5"/>      <uml:Model xmi:type="uml:Model" name="EA_Model" visibility="public">            <packagedElement xmi:type="uml:Package" xmi:id="EAPK_F3388CFE_57A7_4d84_8866_3FB3AADE565A" name="Data Model - SQLServer2012" visibility="public">
                <packagedElement xmi:type="uml:Artifact" xmi:id="EAID_B62341D4_41C6_4c83_A60A_4CA65C2E185E" name="Database SQLServer2012" visibility="public"/>
                <packagedElement xmi:type="uml:Package" xmi:id="EAPK_BA7676C5_40BC_4bd9_A0F5_F6B15E534E8E" name="Logical Model" visibility="public">
                    <packagedElement xmi:type="uml:Class" xmi:id="EAID_2DC36189_CCFB_40bf_A1CB_CD4FB08FE8B5" name="AnamneseStatus" visibility="public">
                        <ownedAttribute xmi:type="uml:Property" xmi:id="EAID_9BBF5184_37F8_4729_9DC1_7ED3B4D8FC98" name="RCHIUNET05_ContextKey" visibility="public" isStatic="false" isReadOnly="false" isDerived="false" isOrdered="true" isUnique="false" isDerivedUnion="false">
                            <lowerValue xmi:type="uml:LiteralInteger" xmi:id="EAID_LI000001_37F8_4729_9DC1_7ED3B4D8FC98" value="1"/>
                            <upperValue xmi:type="uml:LiteralInteger" xmi:id="EAID_LI000002_37F8_4729_9DC1_7ED3B4D8FC98" value="1"/>
                            <type xmi:idref="EASQL_Server_2012_nvarchar"/>
                        </ownedAttribute>
                        <ownedAttribute xmi:type="uml:Property" xmi:id="EAID_BC1F93D0_A7F4_474c_A27E_26D3ABCCFB7B" name="MRNCmpdId" visibility="public" isStatic="false" isReadOnly="false" isDerived="false" isOrdered="false" isUnique="true" isDerivedUnion="false">
                            <lowerValue xmi:type="uml:LiteralInteger" xmi:id="EAID_LI000003_A7F4_474c_A27E_26D3ABCCFB7B" value="1"/>
                            <upperValue xmi:type="uml:LiteralInteger" xmi:id="EAID_LI000004_A7F4_474c_A27E_26D3ABCCFB7B" value="1"/>
                            <type xmi:idref="EASQL_Server_2012_nvarchar"/>
                        </ownedAttribute>
..........

因此,通过我的XSL,我将循环访问相关节点并提取表名和属性。这没有问题。现在我需要将EA数据类型转换为另一种数据类型定义。

让我们说:EASQL_Server_2012_nvarchar需要成为System.String

执行此操作的XSL看起来像这样(因为还有其他数据类型,选择语句将比此处显示的更长):

    <xsl:for-each select="ownedAttribute[@xmi:type='uml:Property']">
    <xsl:text disable-output-escaping="yes">&lt;</xsl:text>
    <xsl:value-of select="'Element Name=&quot;'"/>
    <xsl:value-of select="@name"/>
    <xsl:value-of select="'&quot; '"/>

    <xsl:choose>
      <xsl:when test="@xmi:idref = 'EASQL_Server_2012_nvarchar'">
        <xsl:value-of select="'Type=&quot;'"/>
        <xsl:value-of select="'System.String'"/>
        <xsl:value-of select="'&quot; '"/>
        <xsl:value-of select="'MaxLength=&quot;'"/>
        <xsl:value-of select="'400'"/>
        <xsl:value-of select="'&quot; '"/>
      </xsl:when>
      <xsl:when test="@xmi:idref = 'EASQL_Server_2012_int'">
        <xsl:value-of select="'Type=&quot;'"/>
        <xsl:value-of select="'System.Int32'"/>
        <xsl:value-of select="'&quot; '"/>
      </xsl:when>
......

现在我的问题是,它不会达到测试条件并且总是遇到“否则”声明。

有人知道为什么测试条件不起作用吗?

感谢您对此提供任何帮助。

干杯 桑德罗

1 个答案:

答案 0 :(得分:0)

我怀疑不是:

<xsl:when test="@xmi:idref = 'EASQL_Server_2012_nvarchar'">

你想做的事:

<xsl:when test="type/@xmi:idref = 'EASQL_Server_2012_nvarchar'">

因为在已发布的部分示例中,ownedAttribute(运行此测试时是您的上下文节点)没有xmi:idref属性,但其子元素type具有。{ / p>

P.S。我不知道你在整体上做了什么,但每当我看到时我都会畏缩:

<xsl:text disable-output-escaping="yes">&lt;</xsl:text>

这绝不是必要的。如果 - 看起来 - 您没有输出XML,请将输出方法设置为text。然后,没有必要禁用输出转义。