0

xslt コードを記述して、.UML (XMI 形式) ファイルを XML ファイルに変換しようとしています。初心者ですので、分かりやすく教えていただけると幸いです。現在、入力の 1 つまたは 2 つの要素を読み取り、それらの要素を含む XML 出力を出力しようとしています。

XMI-UML 入力ファイル

<?xml version="1.0" encoding="UTF-8"?> 
<uml:Model xmi:version="20110701" xmlns:xmi="http://www.omg.org/spec/XMI/20110701" xmlns:uml="http://www.eclipse.org/uml2/4.0.0/UML" xmi:id="_OlYJkC9-EeWyX7UKkcyxiw" name="model">
<packagedElement xmi:type="uml:Activity" xmi:id="_OlYJkS9-EeWyX7UKkcyxiw" name="Activity1" node="_XjLyEC9-EeWyX7UKkcyxiw _ZfIhYC9-EeWyX7UKkcyxiw _cK4V8C9-EeWyX7UKkcyxiw _fE2zwC9-EeWyX7UKkcyxiw _F67sgC9_EeWyX7UKkcyxiw">
<edge xmi:type="uml:ControlFlow" xmi:id="_jzMLIC9-EeWyX7UKkcyxiw" name="ControlFlow" source="_XjLyEC9-EeWyX7UKkcyxiw" target="_ZfIhYC9-EeWyX7UKkcyxiw"/>
<edge xmi:type="uml:ControlFlow" xmi:id="_lieXcC9-EeWyX7UKkcyxiw" name="ControlFlow1" source="_ZfIhYC9-EeWyX7UKkcyxiw" target="_cK4V8C9-EeWyX7UKkcyxiw"/>
<node xmi:type="uml:InitialNode" xmi:id="_XjLyEC9-EeWyX7UKkcyxiw" name="Start" outgoing="_jzMLIC9-EeWyX7UKkcyxiw"/>
<node xmi:type="uml:OpaqueAction" xmi:id="_ZfIhYC9-EeWyX7UKkcyxiw" name="Load and Enable Timer" visibility="package" outgoing="_lieXcC9-EeWyX7UKkcyxiw" incoming="_jzMLIC9-EeWyX7UKkcyxiw"/>
  <inputValue xmi:type="uml:ActionInputPin" xmi:id="_82lIMDRBEeWdiarL2UAMaQ" name="interrupt">
    <upperBound xmi:type="uml:LiteralInteger" xmi:id="_82lIMTRBEeWdiarL2UAMaQ" value="1"/>
  </inputValue>
</node>
<node xmi:type="uml:ActivityFinalNode" xmi:id="_F67sgC9_EeWyX7UKkcyxiw" name="ActivityFinalNode" incoming="_Hcj3UC9_EeWyX7UKkcyxiw"/>
 </packagedElement>
</uml:Model>

XSLT コード

<xsl:stylesheet version="1.0" xmlns:UML="org.omg.xmi.namespace.UML" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

<xsl:template match="/">
    <root>
        <xsl:apply-templates />
    </root>
</xsl:template>

<xsl:template match="/uml:Model/packagedElement/edge/">
  <xsl:element name="uml:ControlFlow">
      <xsl:apply-templates />
  </xsl:element>
</xsl:template>

期待される出力 (一例です。入力からの「ノード」を含めることもできます)

<?xml version='1.0' encoding='UTF-8'?>
<sdf3 type='sadf' version='1.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='uri:sadf' xsi:schemaLocation='some_random_location'>
<sadf name='RandomGraphName'>
<structure>
<edge name='ControlFlow1' source='_ZfIhYC9-EeWyX7UKkcyxiw' target='_cK4V8C9-EeWyX7UKkcyxiw' />
</structure>
</sadf>
</sdf3>
4

1 に答える 1

1

一見すると、「UML-XMI」は依然として XML ドキュメントですが、コメントで述べたように、整形式ではありません。問題はこのnode要素にあります

<node xmi:type="uml:OpaqueAction" xmi:id="_ZfIhYC9-EeWyX7UKkcyxiw" name="Load and Enable Timer" visibility="package" outgoing="_lieXcC9-EeWyX7UKkcyxiw" incoming="_jzMLIC9-EeWyX7UKkcyxiw"/>
  <inputValue xmi:type="uml:ActionInputPin" xmi:id="_82lIMDRBEeWdiarL2UAMaQ" name="interrupt">
    <upperBound xmi:type="uml:LiteralInteger" xmi:id="_82lIMTRBEeWdiarL2UAMaQ" value="1"/>
  </inputValue>
</node>

右にスクロールすると、nodeタグは自動的に閉じられます (つまり、 で終了します/>)。これは、終了</node>タグが実際には何にも一致しないことを意味します。

しかし、XSLT の最初の問題は名前空間に関するものです。XML では、名前空間は次のように定義されます。

xmlns:uml="http://www.eclipse.org/uml2/4.0.0/UML"

しかし、あなたの XSLT では、このように定義しています

xmlns:UML="org.omg.xmi.namespace.UML"

プレフィックスは XML と XSLT の間で一致する必要はありませんが、名前空間 URI は一致します。さらに、名前空間プレフィックスを使用するときに XSLT が小文字で使用している場合

<xsl:template match="/uml:Model/packagedElement/edge/">

ただし、大文字と小文字が区別されるため、定義umlした には対応しません。UML接頭辞は XML と一致する必要はありませんが、XSLT で定義されたものと一致する必要があります。

/さらに、そのテンプレート マッチは、記号で終わっているため、構文的にも正しくありません。それを取り除く必要があります。

実際にどのような出力が必要かはよくわかりませんが、次の XSLT を試してみてください。

<xsl:stylesheet version="1.0" xmlns:UML="http://www.eclipse.org/uml2/4.0.0/UML" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns='uri:sadf' exclude-result-prefixes="UML">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

<xsl:template match="/UML:Model">
    <sdf3 xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='some_random_location' type='sadf'>
    <sadf name='RandomGraphName'>
        <xsl:apply-templates />
    </sadf>
    </sdf3>
</xsl:template>

<xsl:template match="packagedElement">
  <structure>
      <xsl:apply-templates select="edge" />
  </structure>
</xsl:template>

<xsl:template match="edge">
  <edge name="{@name}" source="{@source}" />
</xsl:template>
</xsl:stylesheet>

XSLT でのデフォルトの名前空間の使用に注意してくださいxmlns='uri:sadf'。これは、名前空間を持たないすべての要素がその名前空間に出力されることを意味します。

packagedElementまた、やなどの子要素へのフル パスを必ずしもコーディングする必要はないことに注意してくださいedge

ただし、次の適切な形式の入力が与えられます。

<uml:Model xmi:version="20110701" xmlns:xmi="http://www.omg.org/spec/XMI/20110701" xmlns:uml="http://www.eclipse.org/uml2/4.0.0/UML" xmi:id="_OlYJkC9-EeWyX7UKkcyxiw" name="model">
<packagedElement xmi:type="uml:Activity" xmi:id="_OlYJkS9-EeWyX7UKkcyxiw" name="Activity1" node="_XjLyEC9-EeWyX7UKkcyxiw _ZfIhYC9-EeWyX7UKkcyxiw _cK4V8C9-EeWyX7UKkcyxiw _fE2zwC9-EeWyX7UKkcyxiw _F67sgC9_EeWyX7UKkcyxiw">
<edge xmi:type="uml:ControlFlow" xmi:id="_jzMLIC9-EeWyX7UKkcyxiw" name="ControlFlow" source="_XjLyEC9-EeWyX7UKkcyxiw" target="_ZfIhYC9-EeWyX7UKkcyxiw"/>
<edge xmi:type="uml:ControlFlow" xmi:id="_lieXcC9-EeWyX7UKkcyxiw" name="ControlFlow1" source="_ZfIhYC9-EeWyX7UKkcyxiw" target="_cK4V8C9-EeWyX7UKkcyxiw"/>
<node xmi:type="uml:InitialNode" xmi:id="_XjLyEC9-EeWyX7UKkcyxiw" name="Start" outgoing="_jzMLIC9-EeWyX7UKkcyxiw"/>
<node xmi:type="uml:OpaqueAction" xmi:id="_ZfIhYC9-EeWyX7UKkcyxiw" name="Load and Enable Timer" visibility="package" outgoing="_lieXcC9-EeWyX7UKkcyxiw" incoming="_jzMLIC9-EeWyX7UKkcyxiw">
  <inputValue xmi:type="uml:ActionInputPin" xmi:id="_82lIMDRBEeWdiarL2UAMaQ" name="interrupt">
    <upperBound xmi:type="uml:LiteralInteger" xmi:id="_82lIMTRBEeWdiarL2UAMaQ" value="1"/>
  </inputValue>
</node>
<node xmi:type="uml:ActivityFinalNode" xmi:id="_F67sgC9_EeWyX7UKkcyxiw" name="ActivityFinalNode" incoming="_Hcj3UC9_EeWyX7UKkcyxiw"/>
 </packagedElement>
</uml:Model>

以下が出力されます

<sdf3 xmlns="uri:sadf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="some_random_location"
      type="sadf">
   <sadf name="RandomGraphName">
      <structure>
         <edge name="ControlFlow" source="_XjLyEC9-EeWyX7UKkcyxiw"/>
         <edge name="ControlFlow1" source="_ZfIhYC9-EeWyX7UKkcyxiw"/>
      </structure>
   </sadf>
</sdf3>
于 2015-08-16T22:01:38.263 に答える