我有一个关于将我的数据模型(XMI)转换为使用XSLT的XML表示的问题。 XMI看起来像这样(片段):
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="windows-1252"?>
<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="TABLENAME" visibility="public">
<ownedAttribute xmi:type="uml:Property" xmi:id="EAID_9BBF5184_37F8_4729_9DC1_7ED3B4D8FC98" name="ATTRIBUTE_1" 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="ATTRIBUTE_2" 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-File,它使我能够提取表名:
-> packagedElement xmi:type="uml:Class"
和属性
-> ownedAttribute xmi:type="uml:Property"
以及每个属性的数据类型。
最后,我需要将这些信息转换为这样的XML表示:
<Segment Name="TABLENAME">
<Elements>
<Element Name="ATTRIBUTE_1" Type="System.blabla">
</Element>
<Element Name="ATTRIBUTE_2" Type="System.blabla">
</Element>
</Elements>
</Segment>
有人可以提供一些关于如何实现这一目标的提示/样本吗?
非常感谢任何帮助。
干杯 桑德罗
答案 0 :(得分:1)
这只是猜测,因为这个例子不完整 通过在TEXT中指定所有内容来实现它(有点困难),但它对我有用。
<?xml version="1.0" encoding="UTF-8"?>
<!-- ================================================== -->
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
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"
>
<xsl:strip-space elements="*"/>
<xsl:output indent="yes" method="text"/>
<xsl:template match="xmi:XMI">
<xsl:for-each select="uml:Model/packagedElement/packagedElement/packagedElement[@xmi:type='uml:Class']">
<xsl:value-of select="'<Segment Name="'"/>
<xsl:value-of select="@name"/>
<xsl:value-of select="'">'"/>
<xsl:value-of select="' '"/>
<xsl:value-of select="'<Elements>'"/>
<xsl:value-of select="' '"/>
<xsl:for-each select="ownedAttribute[@xmi:type='uml:Property']">
<xsl:value-of select="'<Element Name="'"/>
<xsl:value-of select="@name"/>
<xsl:value-of select="'">'"/>
<xsl:value-of select="' '"/>
<xsl:value-of select="'</Element>'"/>
<xsl:value-of select="' '"/>
</xsl:for-each>
</xsl:for-each>
<xsl:value-of select="'</Elements>'"/>
<xsl:value-of select="' '"/>
<xsl:value-of select="'</Segment>'"/>
<xsl:value-of select="' '"/>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
由于您只对XML中的几个元素感兴趣,因此您可以利用XSLT的built-in templates,它有效地跳过所有元素并且只输出文本节点(其中有只有你的XML中的空格)。这意味着您只需要编写两个模板;每个要处理的元素都有一个。
因此,对于类型为packagedElement
的{{1}},您要创建一个uml:Class
元素,因此模板看起来像这样
Segment
请注意在创建<xsl:template match="packagedElement[@xmi:type='uml:Class']">
<Segment Name="{@name}">
<Elements>
<xsl:apply-templates />
</Elements>
</Segment>
</xsl:template>
属性时使用Attribute Value Templates。花括号表示必须对表达式求值,而不是按字面输出。
同样适用于Name
元素。
ownedAttribute
试试这个XSLT
<xsl:template match="ownedAttribute[@xmi:type='uml:Property']">
<Element Name="{@name}" Type="System.blabla">
</Element>
</xsl:template>
另请注意命名空间前缀<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:xmi="http://schema.omg.org/spec/XMI/2.1">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="packagedElement[@xmi:type='uml:Class']">
<Segment Name="{@name}">
<Elements>
<xsl:apply-templates />
</Elements>
</Segment>
</xsl:template>
<xsl:template match="ownedAttribute[@xmi:type='uml:Property']">
<Element Name="{@name}" Type="System.blabla">
</Element>
</xsl:template>
</xsl:stylesheet>
的定义如何,命名空间URI与输入XML中的名称空间匹配。