2015-09-01 6 views
-2

У меня возник вопрос о преобразовании модели данных (XMI) в XML-представление с помощью XSLT. XMI Похоже, это (фрагмент):Преобразование XMI в XML с использованием XSLT

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

Может кто-то мой некоторый намек/образец, как добиться этого?

Любая помощь очень ценится.

Приветствия Сандро

+1

Где именно вы застряли в этом? –

+0

Можете ли вы показать XSLT с объяснением того, где вы застряли? И, пожалуйста, покажите минимальные рабочие примеры, ваш XML не завершен. Потратьте минутку, чтобы прочитать [mcve], [faq] и [ask]. – Abel

ответ

1

Это лишь предположение, так как пример является неполным.
Это происходит (немного тяжело), ​​указав все в ТЕКСТе, но это сработало для меня.

<?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="'&lt;Segment Name=&quot;'"/> 
      <xsl:value-of select="@name"/> 
      <xsl:value-of select="'&quot;&gt;'"/> 
      <xsl:value-of select="'&#10;'"/> 

      <xsl:value-of select="'&lt;Elements&gt;'"/> 
      <xsl:value-of select="'&#10;'"/> 

      <xsl:for-each select="ownedAttribute[@xmi:type='uml:Property']"> 
       <xsl:value-of select="'&lt;Element Name=&quot;'"/> 
       <xsl:value-of select="@name"/> 
       <xsl:value-of select="'&quot;&gt;'"/> 
       <xsl:value-of select="'&#10;'"/> 

       <xsl:value-of select="'&lt;/Element&gt;'"/> 
       <xsl:value-of select="'&#10;'"/> 
      </xsl:for-each> 
     </xsl:for-each> 

     <xsl:value-of select="'&lt;/Elements&gt;'"/> 
     <xsl:value-of select="'&#10;'"/> 

     <xsl:value-of select="'&lt;/Segment&gt;'"/> 
     <xsl:value-of select="'&#10;'"/> 

    </xsl:template> 
    </xsl:stylesheet> 
+0

Моя проблема в следующем. В моем случае имя tablename находится в атрибуте xmi «packageagedElement xmi: type =« uml: Class »в поле« name »и атрибутах таблицы в« ownedAttribute xmi: type = «uml: Property» также в поле «Имя». Так что мне не ясно, как определить в XSL, что значения в этих атрибутах xmi переведены в представление XML, показанное в приведенном выше примере. Мой XML не является полным, я знаю, что он прост. Это связано с тем, что записи повторяются для каждой таблицы (класса) и содержащихся атрибутов (свойство) Я пробую вышеуказанное решение и даю отзыв :) –

+0

работал до сих пор ... thhhhxxxxx: D –

+0

FWIW (и комплименты для понимания OP!), Если вы используете 'xsl: value-of' с литералами, вы можете просто использовать' xsl: text' и сохранить себе некоторую типизацию и улучшить читаемость. То есть '' then then ' < Сегментное имя =" '. – Abel

1

Как вы только действительно заинтересованы в паре элементов в XML, вы можете воспользоваться XSLT-х built-in templates, который эффективно пропускать все элементы и выводит только текстовые узлы (из которых есть только пробельные те, в ваш XML). Это означает, что вам нужно только написать два шаблона; по одному для каждого из элементов, которые вы хотите обработать.

Таким образом, для packagedElement с типом 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.

<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, который пространство имен URI соответствия один во входном XML.

+0

thx очень Тим C, veeeery полезно, попробуй это :) –

Смежные вопросы