如何使用此源文档和目标文档进行转换?

时间:2010-07-26 23:04:12

标签: xslt

我在SVG中有XML源文件,如下所示:

<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,网关模板等。但是,在目标文档中,我得到了每个父元素都存在的所有子元素('process “)。

因为真实文件比这个例子有很多元素......所以,我已经执行了主要问题来申请剩下的元素。

2 个答案:

答案 0 :(得分:0)

使用以下样式表可以生成所需的输出:

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

答案 1 :(得分:0)

此样式表:

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

编辑:压缩代码。