include yslt.yml2 estylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:ns="pou_block_instances_ns" extension-element-prefixes="ns" exclude-result-prefixes="ns" { template "text()"; template "ppx:pou" { apply "ppx:body/*[self::ppx:FBD or self::ppx:LD or self::ppx:SFC]/*"; } function "add_instance" { param "type"; variable "instance" { > «ns:AddBlockInstance($type, @localId, ppx:position/@x, ppx:position/@y, @width, @height)» } } function "execution_order" { choose { when "@executionOrderId" > «@executionOrderId» otherwise > 0 } } function "ConnectionInfos" { param "type"; param "modifiers"; param "formalParameter"; variable "negated" { choose { when "$modifiers='input'" > «@negatedIn» when "$modifiers='output'" > «@negatedOut» otherwise > «@negated» } } variable "edge" { choose { when "$modifiers='input'" > «@edgeIn» when "$modifiers='output'" > «@edgeOut» otherwise > «@edge» } } variable "instance_connection" { > «ns:AddInstanceConnection($type, $formalParameter, $negated, $edge, ppx:relPosition/@x, ppx:relPosition/@y)» } } template "ppx:position" { variable "link_point" { > «ns:AddLinkPoint(@x, @y)» } } template "ppx:connection" { variable "connection_link" { > «ns:AddConnectionLink(@refLocalId, @formalParameter)» } apply "ppx:position"; } template "ppx:connectionPointIn" { param "modifiers"; param "formalParameter"; call "ConnectionInfos" { with "type" > input with "modifiers" > «$modifiers» with "formalParameter" > «$formalParameter» } apply "ppx:connection"; } template "ppx:connectionPointOut" { param "modifiers"; param "formalParameter"; call "ConnectionInfos" { with "type" > output with "modifiers" > «$modifiers» with "formalParameter" > «$formalParameter» } } template "ppx:connectionPointOutAction" { call "ConnectionInfos" { with "type" > output } } template "ppx:comment" { variable "type" > «local-name()» variable "instance_specific_values" { > «ns:SetSpecificValues(ppx:content/xhtml:p/text())» } call "add_instance" { with "type" > «$type» } } template "ppx:block" { variable "execution_order" { call "execution_order"; } variable "instance_specific_values" { > «ns:SetSpecificValues(@instanceName, $execution_order)» } call "add_instance" { with "type" > «@typeName» } foreach "ppx:inputVariables/ppx:variable" { apply "ppx:connectionPointIn" { with "formalParameter" > «@formalParameter» } } foreach "ppx:outputVariables/ppx:variable" { apply "ppx:connectionPointOut" { with "formalParameter" > «@formalParameter» } } } template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived" { > «@name» } template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:string" { > STRING } template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:wstring" { > WSTRING } template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*" { > «local-name()» } function "VariableBlockInfos" { param "type"; variable "expression" > «ppx:expression/text()» variable "value_type" { choose { when "ancestor::ppx:transition[@name=$expression]" > BOOL when "ancestor::ppx:pou[@name=$expression]" { apply "ancestor::ppx:pou/child::ppx:interface/ppx:returnType" } otherwise { apply "ancestor::ppx:pou/child::ppx:interface/*/ppx:variable[@name=$expression]/ppx:type" } } } variable "execution_order" { call "execution_order"; } variable "instance_specific_values" { > «ns:SetSpecificValues($expression, $value_type, $execution_order)» } call "add_instance" { with "type" > «$type» } apply "ppx:connectionPointIn" { with "modifiers" { choose { when "$type='inout'" > input otherwise > } } } apply "ppx:connectionPointOut" { with "modifiers" { choose { when "$type='inout'" > output otherwise > } } } } template "ppx:inVariable" { call "VariableBlockInfos" with "type", "'input'"; } template "ppx:outVariable" { call "VariableBlockInfos" with "type", "'output'"; } template "ppx:inOutVariable" { call "VariableBlockInfos" with "type", "'inout'"; } template "ppx:connector|ppx:continuation" { variable "type" > «local-name()» variable "instance_specific_values" { > «ns:SetSpecificValues(@name)» } call "add_instance" { with "type" > «$type» } apply "ppx:connectionPointIn"; apply "ppx:connectionPointOut"; } template "ppx:leftPowerRail|ppx:rightPowerRail" { variable "type" > «local-name()» variable "connectors" { choose { when "$type='leftPowerRail'" > «count(ppx:connectionPointOut)» otherwise > «count(ppx:connectionPointIn)» } } variable "instance_specific_values" { > «ns:SetSpecificValues($connectors)» } call "add_instance" { with "type" > «$type» } choose { when "$type='leftPowerRail'" { apply "ppx:connectionPointOut"; } otherwise { apply "ppx:connectionPointIn"; } } } template "ppx:contact|ppx:coil" { variable "type" > «local-name()» variable "storage" { choose { when "$type='coil'" > «@storage» otherwise > } } variable "execution_order" { call "execution_order"; } variable "instance_specific_values" { > «ns:SetSpecificValues(ppx:variable/text(), @negated, @edge, $storage, $execution_order)» } call "add_instance" { with "type" > «$type» } apply "ppx:connectionPointIn"; apply "ppx:connectionPointOut"; } template "ppx:step" { variable "type" > «local-name()» variable "instance_specific_values" { > «ns:SetSpecificValues(@name, @initialStep)» } apply "ppx:connectionPointOutAction"; call "add_instance" { with "type" > «$type» } apply "ppx:connectionPointIn"; apply "ppx:connectionPointOut"; } template "ppx:transition" { variable "type" > «local-name()» variable "priority" { choose { when "@priority" > «@priority» otherwise > 0 } } variable "condition_type" { choose { when "ppx:condition/ppx:connectionPointIn" > connection when "ppx:condition/ppx:reference" > reference when "ppx:condition/ppx:inline" > inline otherwise > } } variable "condition" { choose { when "ppx:reference" > «ppx:condition/ppx:reference/@name» when "ppx:inline" > «ppx:condition/ppx:inline/ppx:body/ppx:ST/xhtml:p/text()» otherwise > } } variable "instance_specific_values" { > «ns:SetSpecificValues($priority, $condition_type, $condition)» } apply "ppx:condition/ppx:connectionPointIn"; call "add_instance" { with "type" > «$type» } apply "ppx:connectionPointIn"; apply "ppx:connectionPointOut"; } template "ppx:selectionDivergence|ppx:selectionConvergence|ppx:simultaneousDivergence|ppx:simultaneousConvergence" { variable "type" > «local-name()» variable "connectors" { choose { when "ppx:selectionDivergence|ppx:simultaneousDivergence" { > «count(ppx:connectionPointOut)» } otherwise > «count(ppx:connectionPointIn)» } } variable "instance_specific_values" { > «ns:SetSpecificValues($connectors)» } call "add_instance" { with "type" > «$type» } apply "ppx:connectionPointIn"; apply "ppx:connectionPointOut"; } template "ppx:jumpStep" { variable "type" > jump variable "instance_specific_values" { > «ns:SetSpecificValues(@targetName)» } call "add_instance" { with "type" > «$type» } apply "ppx:connectionPointIn"; } template "ppx:action" { variable "type" { choose { when "ppx:reference" > reference when "ppx:inline" > inline otherwise > } } variable "value" { choose { when "ppx:reference" > «ppx:reference/@name» when "ppx:inline" > «ppx:inline/ppx:ST/xhtml:p/text()» otherwise > } } variable "qualifier" { choose { when "@qualifier" > «@qualifier» otherwise > N } } variable "actionBlock_action" { > «ns:AddAction($qualifier, $type, $value, @duration, @indicator)» } } template "ppx:actionBlock" { variable "type" > «local-name()» variable "instance_specific_values" { > «ns:SetSpecificValues()» } apply "ppx:action"; call "add_instance" { with "type" > «$type» } apply "ppx:connectionPointIn"; } }