我在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 “)。
因为真实文件比这个例子有很多元素......所以,我已经执行了主要问题来申请剩下的元素。
答案 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>
编辑:压缩代码。