как преобразовать этот исходный и целевой документ?

У меня есть исходный файл XML в SVG, который выглядит следующим образом:

<svg>
<g id='a001' class='pools'>
  <g id='b001' class='pool' name='Proc111'>
        <g id='c001' class='lane' name='User111' PoolID='b001'>
           <g id='d001' class='startevent' name='startevent111' LaneID='c001'></g>
      </g>   
        <g id='c002' class='lane' name='User222' PoolID='b001'>
            <g id='d002' class='gateway' name='gateway111' LaneID='c002'></g>
      </g>
    </g>
     <g id='b002' class='pool' name='Proc222'>
       <g id='c003' class='lane' name=' customer ' PoolID=' b002'>
          <g id='d003' class='endevent' name='endevent111' LaneID='c003'>  </g>
      </g>
    </g>
</g>
<g id='a002' class='messageflows'/>

</svg>

я хочу преобразовать цель XML в следующий документ:

<process id='a001' name='proc111'>
  <laneset>
   <lane name='User111'/>
   <lane name='User222'/>
  </laneset>
  <startevent id='d001' name='startevent111'/>
  <gateway id='d002' name='gateway111'/>
</process>

  <process id='a002' name='proc222'>
  <laneset>
   <lane name='customer'/>
  </laneset>
  <endevent id='d003' name='endevent111'/>
</process>

Я пытался с некоторым преобразованием, но безуспешно... Мое решение - создать основной шаблон; и внутри основного шаблона (шаблона процесса) я вызываю другие шаблоны, такие как starteventtemplate, endeventtemplate, шаблон шлюза и т. д. Однако в целевом документе я получаю все дочерние элементы, которые присутствуют одинаково для каждого родительского элемента («процесс ').

Потому что реальный файл больше, чем этот пример с большим количеством элементов ... Итак, я выполнил основную задачу, чтобы применить для оставшихся элементов.


person user402802    schedule 26.07.2010    source источник


Ответы (2)


Используя следующую таблицу стилей, вы можете создать желаемый результат:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="g[@class='pool']" >
    <process>
      <laneset>
        <xsl:apply-templates mode="laneset" />
      </laneset>
      <xsl:apply-templates mode="startevent" />
      <xsl:apply-templates mode="gateway" />
    </process>
  </xsl:template>

  <xsl:template match="g[@class='lane']" mode="laneset">
    <lane name="{@name}"/>
  </xsl:template>

  <xsl:template match="g[@class='startevent']" mode="startevent">
    <startevent id="{@id}" name="{@name}"/>
  </xsl:template>

  <xsl:template match="g[@class='gateway']" mode="gateway">
    <gateway id="{@id}" name="{@name}"/>
  </xsl:template>

</xsl:stylesheet>
person Dirk Vollmar    schedule 26.07.2010
comment
спасибо! Я работал! Но как вернуть трансформацию. Я имею в виду из документа «процесс» в svg. Еще раз спасибо! - person user402802; 27.07.2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="g[@class='pools']">
        <processes>
            <xsl:apply-templates />
        </processes>
    </xsl:template>
    <xsl:template match="g[@class='pool']" priority="1">
        <process id="{@id}" name="{@name}">
            <laneset>
                <xsl:apply-templates/>
            </laneset>
            <xsl:apply-templates select="*/*"/>
        </process>
    </xsl:template>
    <xsl:template match="g/g">
        <xsl:element name="{@class}">
            <xsl:copy-of select="@id[../@class != 'lane']|@name"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Выход:

<processes>
    <process id="b001" name="Proc111">
        <laneset>
            <lane name="User111" />
            <lane name="User222" />
        </laneset>
        <startevent id="d001" name="startevent111" />
        <gateway id="d002" name="gateway111" />
    </process>
    <process id="b002" name="Proc222">
        <laneset>
            <lane name=" customer " />
        </laneset>
        <endevent id="d003" name="endevent111" />
    </process>
</processes>

EDIT: сжатие кода.

person Community    schedule 27.07.2010