-2

XSLT を使用したデータ モデル (XMI) の 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 ファイルを書きたいと思います。

-> 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>

誰かがこれを達成する方法についてヒント/サンプルを教えてもらえますか?

どんな助けでも大歓迎です。

乾杯サンドロ

4

2 に答える 2

1

XML 内のいくつかの要素だけに本当に関心がある場合は、XSLT の組み込みテンプレートを利用できます。これは、すべての要素を効果的にスキップし、テキスト ノードのみを出力します (XML には空白の要素のみがあります)。つまり、2 つのテンプレートを作成するだけで済みます。処理したい要素ごとに 1 つ。

packagedElementのタイプの のuml:Class場合、要素を作成しているのでSegment、テンプレートは次のようになります

<xsl:template match="packagedElement[@xmi:type='uml:Class']">
    <Segment Name="{@name}">
        <Elements>
            <xsl:apply-templates />
        </Elements>
    </Segment>            
</xsl:template>

属性を作成する際に属性値テンプレートを使用することに注意してくださいName。中括弧は、文字どおりに出力するのではなく、式を評価する必要があることを意味します。

要素についても同様ですownedAttribute

<xsl:template match="ownedAttribute[@xmi:type='uml:Property']">
    <Element Name="{@name}" Type="System.blabla">
    </Element>         
</xsl:template>

このXSLTを試してください

<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>

xmiまた、入力 XML の名前空間 URI と一致する名前空間 URI の名前空間プレフィックスの定義があることにも注意してください。

于 2015-09-01T16:42:17.090 に答える