Эта таблица стилей:
<xsl:stylesheet version="1.0"
exclude-result-prefixes="m"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:m="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:x="org.w3c.dom.svg">
<xsl:variable name="attrSet">
<dummy x="0" dy="10"/>
</xsl:variable>
<xsl:template match="m:definitions">
<svg version="1.1">
<g id="BPMNDIAGRAM" transform="scale(1)">
<g id="POOLS" class="POOLS">
<xsl:apply-templates />
</g>
</g>
</svg>
</xsl:template>
<xsl:template match="m:process">
<g class="POOL">
<xsl:apply-templates select="@id"/>
<xsl:apply-templates select="@name|m:laneSet/*"/>
</g>
</xsl:template>
<xsl:template match="*">
<xsl:param name="idName" select="'PoolID'"/>
<xsl:param name="id" select="../../@id"/>
<g class="{translate(name(),
'lanedvtsrmi',
'LANEDVTSRMI')}">
<xsl:attribute name="{$idName}">
<xsl:apply-templates select="$id" mode="id"/>
</xsl:attribute>
<xsl:apply-templates select="@id"/>
<xsl:apply-templates select="@name"/>
<xsl:apply-templates/>
</g>
</xsl:template>
<xsl:template match="m:flowNodeRefs[position()!=1]"/>
<xsl:template match="m:flowNodeRefs[1]">
<g class="EVENTS">
<xsl:attribute name="id">
<xsl:text>EVENTS_</xsl:text>
<xsl:apply-templates select="../@id" mode="id"/>
</xsl:attribute>
<xsl:apply-templates select="../../../*[@id = current()/../*]">
<xsl:with-param name="idName" select="'LaneID'"/>
<xsl:with-param name="id" select="../@id"/>
</xsl:apply-templates>
</g>
</xsl:template>
<xsl:template match="@id">
<xsl:attribute name="id">
<xsl:apply-templates select="." mode="id"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="@id" mode="id">
<xsl:value-of select="concat(substring(.,1,8),'-',
substring(.,9,4),'-',
substring(.,13,4),'-',
substring(.,17,4),'-',
substring(.,21))"/>
</xsl:template>
<xsl:template match="@name">
<g>
<text>
<tspan>
<xsl:copy-of select="document('')/*/xsl:variable
[@name='attrSet']/*/@*
[not(current()/../self::m:endEvent|
current()/../self::m:process)]
[not(generate-id(current()/..) =
generate-id(current()/../../m:lane[1]))]"/>
<xsl:value-of select="."/>
</tspan>
</text>
</g>
</xsl:template>
</xsl:stylesheet>
Вывод:
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:x="org.w3c.dom.svg">
<g id="BPMNDIAGRAM" transform="scale(1)">
<g id="POOLS" class="POOLS">
<g class="POOL" id="DA444C7E-B7A9-2BC0-EC61-5091EFE52E9F">
<g>
<text>
<tspan>Process111</tspan>
</text>
</g>
<g class="LANE" PoolID="DA444C7E-B7A9-2BC0-EC61-5091EFE52E9F" id="BE805267-E226-61E2-5210-E901418B7DA2">
<g>
<text>
<tspan>Lane111</tspan>
</text>
</g>
<g class="EVENTS" id="EVENTS_BE805267-E226-61E2-5210-E901418B7DA2">
<g class="STARTEVENT" LaneID="BE805267-E226-61E2-5210-E901418B7DA2" id="E705CE86-B889-7B26-6BA6-AC81E2F1A5BC">
<g>
<text>
<tspan x="0" dy="10">Start111</tspan>
</text>
</g>
</g>
<g class="ENDEVENT" LaneID="BE805267-E226-61E2-5210-E901418B7DA2" id="643E3A26-322B-EECB-2DBD-84BF2A6F9CA5">
<g>
<text>
<tspan>End111</tspan>
</text>
</g>
</g>
</g>
</g>
<g class="LANE" PoolID="DA444C7E-B7A9-2BC0-EC61-5091EFE52E9F" id="2F92C8B2-7CE5-2AFD-B382-D4EAC634E634">
<g>
<text>
<tspan x="0" dy="10">Lane222</tspan>
</text>
</g>
<g class="EVENTS" id="EVENTS_2F92C8B2-7CE5-2AFD-B382-D4EAC634E634">
<g class="STARTEVENT" LaneID="2F92C8B2-7CE5-2AFD-B382-D4EAC634E634" id="A65A0630-689F-A02F-3BBB-6AC27D906603">
<g>
<text>
<tspan x="0" dy="10">Start222</tspan>
</text>
</g>
</g>
<g class="TERMINATEEVENT" LaneID="2F92C8B2-7CE5-2AFD-B382-D4EAC634E634" id="DDA49A78-36C1-3B7D-C320-8778C4B03526">
<g>
<text>
<tspan x="0" dy="10">Terminate111</tspan>
</text>
</g>
</g>
</g>
</g>
</g>
<g class="POOL" id="A7F84E7E-A73F-9436-DCB9-25D5C3208227">
<g>
<text>
<tspan>Process2222</tspan>
</text>
</g>
<g class="LANE" PoolID="A7F84E7E-A73F-9436-DCB9-25D5C3208227" id="B8EE1D7A-A494-C6D2-5656-434F1CAF803F">
<g>
<text>
<tspan>Lane444</tspan>
</text>
</g>
</g>
</g>
</g>
</g>
</svg>
Примечание : эти строки
<xsl:apply-templates select="@id"/>
<xsl:apply-templates select="@name|m:laneSet/*"/>
И
<xsl:apply-templates select="@id"/>
<xsl:apply-templates select="@name"/>
<xsl:apply-templates/>
Может быть как
<xsl:apply-templates select="@*|m:laneSet/*"/>
И
<xsl:apply-templates select="@*|*"/>
Но в спецификации нет гарантии, что атрибуты обрабатываются в любом порядке (кроме того, что до дочерних элементов).
Кроме того, я использую хитрый способ добавления атрибутов x
и dy
.Но условия в предикатах можно использовать в качестве теста для xsl:if
, добавив эти атрибуты с xsl:attribute
.