Difference between revisions of "XML Data mapper"
(→Filter) |
(→Links) |
||
(16 intermediate revisions by 2 users not shown) | |||
Line 2: | Line 2: | ||
XML Data mapper module allows users to design a XSL data transformation from one XML document, defined by a source xsd, to another XML document, defined by a target xsd. The designer output is a XSL document associated to a data transformation defined in [[{{VULCON}}]]. | XML Data mapper module allows users to design a XSL data transformation from one XML document, defined by a source xsd, to another XML document, defined by a target xsd. The designer output is a XSL document associated to a data transformation defined in [[{{VULCON}}]]. | ||
The use of a graphical designer speeds up the process of defining the data mapping, and gives it a simple and efficient graphical representation. | The use of a graphical designer speeds up the process of defining the data mapping, and gives it a simple and efficient graphical representation. | ||
+ | |||
+ | (in the examples the output namespaces have been removed for clarity) | ||
==Create a data transformation== | ==Create a data transformation== | ||
Line 37: | Line 39: | ||
*double click a .gvxdt file previously created in the Project view; | *double click a .gvxdt file previously created in the Project view; | ||
*right-clicking on the XSLTransformation in the core view and then choosing the 'Open mapping <transformation name>' item. | *right-clicking on the XSLTransformation in the core view and then choosing the 'Open mapping <transformation name>' item. | ||
+ | ===Import Function=== | ||
+ | The import function is a top-level element that is used to import the contents of one style sheet into another. | ||
+ | Is it possible to assign a value to a parameter of an imported stylesheet. | ||
+ | |||
+ | Parameter: | ||
+ | *uri: attribute whose value is a URI reference identifying the stylesheet to be imported | ||
+ | *param-name: parameter of imported stylesheet (otional) | ||
+ | |||
+ | [[File:Import.png|thumb|Import Function without parameter]] | ||
+ | <syntaxhighlight lang="xml"> | ||
+ | <?xml version="1.0" encoding="UTF-8"?> | ||
+ | <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | ||
+ | exclude-result-prefixes="xsl fs" version="2.0" | ||
+ | xmlns:fs="http://www.w3.org/2005/xpath-functions" | ||
+ | xmlns:gv="http://www.greenvulcano.it/greenvulcano" | ||
+ | xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||
+ | <xsl:import href="getPerson.xsl"/> | ||
+ | <xsl:output encoding="utf-8" indent="yes" method="xml"/> | ||
+ | <xsl:template match="/"> | ||
+ | <xsl:element name="anagrafica" namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:element name="persona" | ||
+ | namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:apply-imports/> | ||
+ | </xsl:element> | ||
+ | </xsl:element> | ||
+ | </xsl:template> | ||
+ | </xsl:stylesheet> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | [[File:ImportWithParam.png|thumb|Import Function with parameter]] | ||
+ | <syntaxhighlight lang="xml"> | ||
+ | <?xml version="1.0" encoding="UTF-8"?> | ||
+ | <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | ||
+ | exclude-result-prefixes="xsl fs" version="2.0" | ||
+ | xmlns:fs="http://www.w3.org/2005/xpath-functions" | ||
+ | xmlns:gv="http://www.greenvulcano.it/greenvulcano" | ||
+ | xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||
+ | <xsl:import href="getPerson.xsl"> | ||
+ | <xsl:with-param name="param" select="/RowSet/data/row/col[1]"/> | ||
+ | </xsl:import> | ||
+ | <xsl:output encoding="utf-8" indent="yes" method="xml"/> | ||
+ | <xsl:template match="/"> | ||
+ | <xsl:element name="anagrafica" namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:element name="persona" | ||
+ | namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:apply-imports/> | ||
+ | </xsl:element> | ||
+ | </xsl:element> | ||
+ | </xsl:template> | ||
+ | </xsl:stylesheet> | ||
+ | </syntaxhighlight> | ||
===Links=== | ===Links=== | ||
Line 45: | Line 98: | ||
*template: a template node will be created, activated by the source element | *template: a template node will be created, activated by the source element | ||
*for-each: a for-each node will be created to process iteratively the source element | *for-each: a for-each node will be created to process iteratively the source element | ||
+ | *none: has not created any link | ||
+ | [[File:LinkTemplate.png|thumb|Link complex node with parameter template]] | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | <syntaxhighlight lang="xml"> | ||
+ | <?xml version="1.0" encoding="UTF-8"?> | ||
+ | <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | ||
+ | exclude-result-prefixes="xsl fs" version="2.0" | ||
+ | xmlns:fs="http://www.w3.org/2005/xpath-functions" | ||
+ | xmlns:gv="http://www.greenvulcano.it/greenvulcano" | ||
+ | xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||
+ | <xsl:output encoding="utf-8" indent="yes" method="xml"/> | ||
+ | <xsl:template match="/"> | ||
+ | <xsl:element name="anagrafica" namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:apply-templates select="/RowSet/data"/> | ||
+ | </xsl:element> | ||
+ | </xsl:template> | ||
+ | <xsl:template match="/RowSet/data"> | ||
+ | <xsl:element name="persona" namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:element name="cognome" | ||
+ | namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:value-of select="row/col[1]"/> | ||
+ | </xsl:element> | ||
+ | <xsl:element name="nome" namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:value-of select="row/col[2]"/> | ||
+ | </xsl:element> | ||
+ | <xsl:element name="citta" namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:value-of select="row/col[3]"/> | ||
+ | </xsl:element> | ||
+ | </xsl:element> | ||
+ | </xsl:template> | ||
+ | </xsl:stylesheet> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | [[File:LinkForEach.png|thumb|Link complex node with parameter template]] | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | <syntaxhighlight lang="xml"> | ||
+ | <?xml version="1.0" encoding="UTF-8"?> | ||
+ | <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | ||
+ | exclude-result-prefixes="xsl fs" version="2.0" | ||
+ | xmlns:fs="http://www.w3.org/2005/xpath-functions" | ||
+ | xmlns:gv="http://www.greenvulcano.it/greenvulcano" | ||
+ | xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||
+ | <xsl:output encoding="utf-8" indent="yes" method="xml"/> | ||
+ | <xsl:template match="/"> | ||
+ | <xsl:element name="anagrafica" namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:for-each select="/RowSet/data"> | ||
+ | <xsl:element name="persona" | ||
+ | namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:element name="cognome" | ||
+ | namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:value-of select="row/col[1]"/> | ||
+ | </xsl:element> | ||
+ | <xsl:element name="nome" | ||
+ | namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:value-of select="row/col[2]"/> | ||
+ | </xsl:element> | ||
+ | <xsl:element name="citta" | ||
+ | namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:value-of select="row/col[3]"/> | ||
+ | </xsl:element> | ||
+ | </xsl:element> | ||
+ | </xsl:for-each> | ||
+ | </xsl:element> | ||
+ | </xsl:template> | ||
+ | </xsl:stylesheet> | ||
+ | </syntaxhighlight> | ||
Other Properties: | Other Properties: | ||
Line 50: | Line 181: | ||
*condition: boolean condition applied to template, condition is a drop list of all the condition that have been defined in the transformation | *condition: boolean condition applied to template, condition is a drop list of all the condition that have been defined in the transformation | ||
*priority: priority of a template rule is specified by the priority attribute on the template rule. | *priority: priority of a template rule is specified by the priority attribute on the template rule. | ||
+ | |||
+ | If you need to map the node and add a value you can use the link-and-value | ||
+ | [[File:Link-and-value.png|thumb|Link complex node with parameter template]] | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | <syntaxhighlight lang="xml"> | ||
+ | <?xml version="1.0" encoding="UTF-8"?> | ||
+ | <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | ||
+ | exclude-result-prefixes="xsl fs" version="2.0" | ||
+ | xmlns:fs="http://www.w3.org/2005/xpath-functions" | ||
+ | xmlns:gv="http://www.greenvulcano.it/greenvulcano" | ||
+ | xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||
+ | <xsl:output encoding="utf-8" indent="yes" method="xml"/> | ||
+ | <xsl:template match="/"> | ||
+ | <xsl:element name="anagrafica" namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:element name="cliente"> | ||
+ | <xsl:value-of select="col"/> | ||
+ | <xsl:element name="cognome" | ||
+ | namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:value-of select="col[1]"/> | ||
+ | </xsl:element> | ||
+ | <xsl:element name="nome" | ||
+ | namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:value-of select="col[3]"/> | ||
+ | </xsl:element> | ||
+ | <xsl:element name="citta" | ||
+ | namespace="http://www.greenvulcano.it/greenvulcano"/> | ||
+ | <xsl:element name="nomecompleto" | ||
+ | namespace="http://www.greenvulcano.it/greenvulcano"> | ||
+ | <xsl:value-of select="col[4]"/> | ||
+ | </xsl:element> | ||
+ | </xsl:element> | ||
+ | </xsl:element> | ||
+ | </xsl:template> | ||
+ | </xsl:stylesheet> | ||
+ | </syntaxhighlight> | ||
===Functions=== | ===Functions=== | ||
Line 77: | Line 247: | ||
You can assign a constant value parameter of a function between right-clicking the mouse on the parameter | You can assign a constant value parameter of a function between right-clicking the mouse on the parameter | ||
− | === | + | ===Conditional Processing with if=== |
There are two ways to insert an if statement: | There are two ways to insert an if statement: | ||
*Using the if statement as function | *Using the if statement as function | ||
Line 83: | Line 253: | ||
[[File:mappingif.png|thumb|if function]] | [[File:mappingif.png|thumb|if function]] | ||
If the function is used when you want to insert an condition mapping of a complex node. | If the function is used when you want to insert an condition mapping of a complex node. | ||
− | + | <syntaxhighlight lang="xml"> | |
− | <xsl:element name="anagrafica | + | <xsl:element name="anagrafica"> |
<xsl:if test="/RowSet/data/row/col[1] = string('Romano')"> | <xsl:if test="/RowSet/data/row/col[1] = string('Romano')"> | ||
<xsl:for-each select="/RowSet/data/row/col[1]"> | <xsl:for-each select="/RowSet/data/row/col[1]"> | ||
− | <xsl:element name="cliente | + | <xsl:element name="cliente"> |
− | + | <xsl:element name="cognome"> | |
− | <xsl:element name="cognome | ||
− | |||
<xsl:value-of select="concat(null,/RowSet/data/row/col[2],/RowSet/data/row/col[3])"/> | <xsl:value-of select="concat(null,/RowSet/data/row/col[2],/RowSet/data/row/col[3])"/> | ||
</xsl:element> | </xsl:element> | ||
− | <xsl:element name="nome | + | <xsl:element name="nome"/> |
− | + | <xsl:element name="citta"/> | |
− | <xsl:element name="citta | + | <xsl:element name="nomecompleto"/> |
− | |||
− | <xsl:element name="nomecompleto | ||
− | |||
</xsl:element> | </xsl:element> | ||
</xsl:for-each> | </xsl:for-each> | ||
</xsl:if> | </xsl:if> | ||
</xsl:element> | </xsl:element> | ||
− | + | </syntaxhighlight> | |
[[File:mappingif2.png|thumb|if function]] | [[File:mappingif2.png|thumb|if function]] | ||
Use the property when you want to map a simple node | Use the property when you want to map a simple node | ||
− | + | <syntaxhighlight lang="xml"> | |
− | <xsl:element name="cliente | + | <xsl:element name="cliente"> |
− | |||
<xsl:if test="/RowSet/data/row/col[1] = 'Romano'"> | <xsl:if test="/RowSet/data/row/col[1] = 'Romano'"> | ||
− | <xsl:element name="cognome | + | <xsl:element name="cognome"> |
− | |||
<xsl:value-of select="/RowSet/data/row/col[1]"/> | <xsl:value-of select="/RowSet/data/row/col[1]"/> | ||
</xsl:element> | </xsl:element> | ||
Line 117: | Line 280: | ||
</xsl:element> | </xsl:element> | ||
</xsl:element> | </xsl:element> | ||
+ | </syntaxhighlight> | ||
+ | ===Conditional Processing with choose=== | ||
+ | The choose element selects one among a number of possible alternatives. | ||
+ | [[File:Choose.png|thumb|Choose]] | ||
+ | <syntaxhighlight lang="xml"> | ||
+ | <xsl:template match="/"> | ||
+ | <xsl:element name="anagrafica"> | ||
+ | <xsl:apply-templates select="/RowSet/data/row"/> | ||
+ | </xsl:element> | ||
+ | </xsl:template> | ||
+ | <xsl:template match="/RowSet/data/row"> | ||
+ | <xsl:element name="cliente"> | ||
+ | <xsl:choose> | ||
+ | <xsl:when test="position() = 1"> | ||
+ | <xsl:element name="cognome"> | ||
+ | <xsl:value-of select="col"/> | ||
+ | </xsl:element> | ||
+ | </xsl:when> | ||
+ | <xsl:when test="col[1] = col[2]"> | ||
+ | <xsl:element name="cognome"> | ||
+ | <xsl:value-of select="col[1]"/> | ||
+ | </xsl:element> | ||
+ | </xsl:when> | ||
+ | <xsl:when test="count(col) > 0"> | ||
+ | <xsl:element name="cognome"> | ||
+ | <xsl:value-of select="col[3]"/> | ||
+ | </xsl:element> | ||
+ | </xsl:when> | ||
+ | <xsl:otherwise> | ||
+ | <xsl:element name="cognome"> | ||
+ | <xsl:value-of select="col[4]"/> | ||
+ | </xsl:element> | ||
+ | </xsl:otherwise> | ||
+ | </xsl:choose> | ||
+ | <xsl:element name="nome"/> | ||
+ | <xsl:element name="citta"> | ||
+ | <xsl:value-of select="col[2]"/> | ||
+ | </xsl:element> | ||
+ | </xsl:element> | ||
+ | </xsl:template> | ||
+ | </syntaxhighlight> | ||
===Filter=== | ===Filter=== | ||
There are two ways to insert an filter: | There are two ways to insert an filter: | ||
Line 126: | Line 330: | ||
If you enter without condition filters you can use the first method. | If you enter without condition filters you can use the first method. | ||
[[File:Filter.png|thumb|Filter]] | [[File:Filter.png|thumb|Filter]] | ||
+ | <syntaxhighlight lang="xml"> | ||
<xsl:template match="/"> | <xsl:template match="/"> | ||
− | <xsl:element name="anagrafica | + | <xsl:element name="anagrafica"> |
<xsl:apply-templates select="/RowSet/data/row"/> | <xsl:apply-templates select="/RowSet/data/row"/> | ||
− | <xsl:element name="cliente | + | <xsl:element name="cliente"> |
− | + | <xsl:element name="cognome"/> | |
− | <xsl:element name="cognome | + | <xsl:element name="nome"/> |
− | + | <xsl:element name="citta"/> | |
− | <xsl:element name="nome | + | <xsl:element name="citta"> |
− | |||
− | <xsl:element name="citta | ||
− | |||
− | <xsl:element name="citta | ||
− | |||
<xsl:value-of select="concat(/RowSet/data/row/col[1],/RowSet/data/row[1]/col[2])"/> | <xsl:value-of select="concat(/RowSet/data/row/col[1],/RowSet/data/row[1]/col[2])"/> | ||
</xsl:element> | </xsl:element> | ||
Line 144: | Line 344: | ||
</xsl:element> | </xsl:element> | ||
</xsl:template> | </xsl:template> | ||
− | + | </syntaxhighlight> | |
If you enter concondition filters you can use the second method. | If you enter concondition filters you can use the second method. | ||
[[File:Filterwithcond.png|thumb|Filter with condition]] | [[File:Filterwithcond.png|thumb|Filter with condition]] | ||
+ | <syntaxhighlight lang="xml"> | ||
<xsl:template match="/"> | <xsl:template match="/"> | ||
− | <xsl:element name="anagrafica | + | <xsl:element name="anagrafica"> |
<xsl:apply-templates select="/RowSet/data/row"/> | <xsl:apply-templates select="/RowSet/data/row"/> | ||
</xsl:element> | </xsl:element> | ||
</xsl:template> | </xsl:template> | ||
<xsl:template match="/RowSet/data/row"> | <xsl:template match="/RowSet/data/row"> | ||
− | <xsl:element name="cliente | + | <xsl:element name="cliente"> |
− | <xsl:element name="cognome | + | <xsl:element name="cognome"/> |
− | |||
<xsl:for-each select="col[position() = 1]"> | <xsl:for-each select="col[position() = 1]"> | ||
− | <xsl:element name="nome | + | <xsl:element name="nome"> |
− | |||
<xsl:value-of select="."/> | <xsl:value-of select="."/> | ||
</xsl:element> | </xsl:element> | ||
</xsl:for-each> | </xsl:for-each> | ||
− | <xsl:element name="citta | + | <xsl:element name="citta"> |
<xsl:value-of select="."/> | <xsl:value-of select="."/> | ||
</xsl:element> | </xsl:element> | ||
</xsl:element> | </xsl:element> | ||
</xsl:template | </xsl:template | ||
− | + | </syntaxhighlight> | |
===Variables=== | ===Variables=== | ||
− | To enter a variable in the transformation use the function | + | To enter a variable in the transformation use the function variable in tab Core. |
[[File:Variable.png|thumb|Variable]] | [[File:Variable.png|thumb|Variable]] | ||
− | + | <syntaxhighlight lang="xml"> | |
<xsl:template match="/"> | <xsl:template match="/"> | ||
− | <xsl:element name="anagrafica | + | <xsl:element name="anagrafica"> |
<xsl:apply-templates select="/RowSet/data/row"/> | <xsl:apply-templates select="/RowSet/data/row"/> | ||
</xsl:element> | </xsl:element> | ||
Line 179: | Line 378: | ||
<xsl:template match="/RowSet/data/row"> | <xsl:template match="/RowSet/data/row"> | ||
<xsl:variable name="var" select="concat(col[1],col[2])"/> | <xsl:variable name="var" select="concat(col[1],col[2])"/> | ||
− | <xsl:element name="cliente | + | <xsl:element name="cliente"> |
− | <xsl:element name="cognome | + | <xsl:element name="cognome"> |
− | |||
<xsl:value-of select="$var"/> | <xsl:value-of select="$var"/> | ||
</xsl:element> | </xsl:element> | ||
− | <xsl:element name="nome | + | <xsl:element name="nome"> |
<xsl:value-of select="$var"/> | <xsl:value-of select="$var"/> | ||
</xsl:element> | </xsl:element> | ||
− | <xsl:element name="citta | + | <xsl:element name="citta"> |
<xsl:value-of select="col[3]"/> | <xsl:value-of select="col[3]"/> | ||
</xsl:element> | </xsl:element> | ||
</xsl:element> | </xsl:element> | ||
</xsl:template> | </xsl:template> | ||
− | + | </syntaxhighlight> | |
===Parameter=== | ===Parameter=== | ||
To enter a parameter in the transformation use the function parameter. | To enter a parameter in the transformation use the function parameter. | ||
− | + | Name is the name of the parameter, and value is the default value. | |
[[File:Parameter.png|thumb|Parameter]] | [[File:Parameter.png|thumb|Parameter]] | ||
− | <xsl:element name="anagrafica | + | <syntaxhighlight lang="xml"> |
− | <xsl:element name="cliente | + | <xsl:element name="anagrafica"> |
− | + | <xsl:element name="cliente"> | |
− | <xsl:element name="cognome | + | <xsl:element name="cognome"> |
− | |||
<xsl:value-of select="$param"/> | <xsl:value-of select="$param"/> | ||
</xsl:element> | </xsl:element> | ||
− | <xsl:element name="nome | + | <xsl:element name="nome"/> |
− | + | <xsl:element name="citta"/> | |
− | <xsl:element name="citta | + | <xsl:element name="nomecompleto"/> |
− | |||
− | <xsl:element name="nomecompleto | ||
− | |||
</xsl:element> | </xsl:element> | ||
</xsl:element> | </xsl:element> | ||
− | + | </syntaxhighlight> | |
===Parameter template=== | ===Parameter template=== | ||
To defines the value of a parameter to be passed into a template must use the paramtemplate function. | To defines the value of a parameter to be passed into a template must use the paramtemplate function. | ||
[[File:Paramtemplate.png|thumb|Parameter Template]] | [[File:Paramtemplate.png|thumb|Parameter Template]] | ||
− | <xsl:param name=" | + | <syntaxhighlight lang="xml"> |
+ | <xsl:param name="paramname" select="'value'"/> | ||
<xsl:template match="/"> | <xsl:template match="/"> | ||
− | <xsl:element name="anagrafica | + | <xsl:element name="anagrafica"> |
<xsl:apply-templates select="/RowSet/data/row/col"> | <xsl:apply-templates select="/RowSet/data/row/col"> | ||
− | <xsl:with-param name=" | + | <xsl:with-param name="paramname" select="value"/> |
</xsl:apply-templates> | </xsl:apply-templates> | ||
</xsl:element> | </xsl:element> | ||
</xsl:template> | </xsl:template> | ||
<xsl:template match="/RowSet/data/row/col"> | <xsl:template match="/RowSet/data/row/col"> | ||
− | <xsl:param name=" | + | <xsl:param name="paramname"/> |
− | <xsl:element name="cliente | + | <xsl:element name="cliente"> |
− | <xsl:element name="cognome | + | <xsl:element name="cognome"> |
− | + | <xsl:value-of select="$paramname"/> | |
− | <xsl:value-of select="$ | ||
</xsl:element> | </xsl:element> | ||
− | <xsl:element name="nome | + | <xsl:element name="nome"> |
<xsl:value-of select="/RowSet/data/row/col[2]"/> | <xsl:value-of select="/RowSet/data/row/col[2]"/> | ||
</xsl:element> | </xsl:element> | ||
− | <xsl:element name="ente | + | <xsl:element name="ente"> |
<xsl:value-of select="/RowSet/data/row/col[3]"/> | <xsl:value-of select="/RowSet/data/row/col[3]"/> | ||
</xsl:element> | </xsl:element> | ||
</xsl:element> | </xsl:element> | ||
</xsl:template> | </xsl:template> | ||
− | + | </syntaxhighlight> | |
===Additional nodes=== | ===Additional nodes=== | ||
Some XSL transformations need to create nodes by duplicating the base node. To realize this operation, simply select the base node with the right mouse button and then a new duplicate node will be created. An ordinal value will be reported next to the new selected node. A node with an 'n' ordinal value represents the only n-th instance of that node. A node without ordinal values represents all the nodes of that type. | Some XSL transformations need to create nodes by duplicating the base node. To realize this operation, simply select the base node with the right mouse button and then a new duplicate node will be created. An ordinal value will be reported next to the new selected node. A node with an 'n' ordinal value represents the only n-th instance of that node. A node without ordinal values represents all the nodes of that type. |
Latest revision as of 09:58, 24 February 2015
Contents
Introduction
XML Data mapper module allows users to design a XSL data transformation from one XML document, defined by a source xsd, to another XML document, defined by a target xsd. The designer output is a XSL document associated to a data transformation defined in VulCon. The use of a graphical designer speeds up the process of defining the data mapping, and gives it a simple and efficient graphical representation.
(in the examples the output namespaces have been removed for clarity)
Create a data transformation
The steps required to create a graphical data transformation are:
- Verify that the XSD documents describing the source/target XMLs are present in the /conf/xsds folder
- Access the VulCon Core view and expand the GVDataTransformation node
- Click on Transformations item with right mouse button and choose in the drop-down list
Transformations --> Create XSLT Transformation
- Populate the wizard parameters:
- Transformation Name: the name by which the transformation is referenced by GreenVulcano® ESB Core. Is also the name of the editor configuration file with .gvxdt extension and of the XSL transformation file with .xsl extension
- Data Source: the data source name that indicates the DTE repository where files will be created
- Path XSL: sub-folders of the selected data source path in which the XSL file will be generated
- XSD Input: XSD file name defining the source document. The files suggested by the drop-down list must be stored in the /conf/xsds folder
- root XSD Input: root element of the source XML document from which start the data transformation operation
- XSD Output: XSD file name defining the target document. The files suggested by the drop-down list must be stored in the /conf/xsds folder
- root XSD Output: root element of the target XML document
- Click the Finish button: in Graphic Editor VulCon perspective will appear the Data mapper graphic editor in which in possible to design the transformation
- Generate the resultant XSL file.
Data mapper graphic editor
In Data mapper graphic editor are visible the representations for input and output formats.Items followed by '=' character are attributes, while those enclosed in angle brackets '<>' are nodes of the XML document. Is it possible to collaps or expand child nodes simply by clicking on '+' or '-' symbols on the left of each node name. The right panel contains the palettes used for the definition of the data mapping functions. The Select button allows the selection of the xsd nodes interested for the transformation. The Create link button allows to define links:
- between a source and a target element;
- between a source element and a parameter of a function;
- between the output of a function and a parameter of another function;
- between the output of a function and a target element.
In the folders below that buttons, it is possible to access the functions used for data-mapping grouped by topic.
Open editor
To open the editor you can:
- double click a .gvxdt file previously created in the Project view;
- right-clicking on the XSLTransformation in the core view and then choosing the 'Open mapping <transformation name>' item.
Import Function
The import function is a top-level element that is used to import the contents of one style sheet into another. Is it possible to assign a value to a parameter of an imported stylesheet.
Parameter:
- uri: attribute whose value is a URI reference identifying the stylesheet to be imported
- param-name: parameter of imported stylesheet (otional)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xsl fs" version="2.0"
xmlns:fs="http://www.w3.org/2005/xpath-functions"
xmlns:gv="http://www.greenvulcano.it/greenvulcano"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:import href="getPerson.xsl"/>
<xsl:output encoding="utf-8" indent="yes" method="xml"/>
<xsl:template match="/">
<xsl:element name="anagrafica" namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:element name="persona"
namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:apply-imports/>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xsl fs" version="2.0"
xmlns:fs="http://www.w3.org/2005/xpath-functions"
xmlns:gv="http://www.greenvulcano.it/greenvulcano"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:import href="getPerson.xsl">
<xsl:with-param name="param" select="/RowSet/data/row/col[1]"/>
</xsl:import>
<xsl:output encoding="utf-8" indent="yes" method="xml"/>
<xsl:template match="/">
<xsl:element name="anagrafica" namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:element name="persona"
namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:apply-imports/>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Links
A link is a relation between the node in the source format and its counterpart in the target format. Clicking the Create link button in the Palette pane, link mode is enabled. In this mode is possible to create new connection simply clicking on a node in the XSD source model, and dragging it on a target node. Once defined a new connection in the graphic area, its properties are shown in Properties area. 'Match' property allows the definition of the selected mapping generation mode:
- template: a template node will be created, activated by the source element
- for-each: a for-each node will be created to process iteratively the source element
- none: has not created any link
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xsl fs" version="2.0"
xmlns:fs="http://www.w3.org/2005/xpath-functions"
xmlns:gv="http://www.greenvulcano.it/greenvulcano"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output encoding="utf-8" indent="yes" method="xml"/>
<xsl:template match="/">
<xsl:element name="anagrafica" namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:apply-templates select="/RowSet/data"/>
</xsl:element>
</xsl:template>
<xsl:template match="/RowSet/data">
<xsl:element name="persona" namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:element name="cognome"
namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:value-of select="row/col[1]"/>
</xsl:element>
<xsl:element name="nome" namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:value-of select="row/col[2]"/>
</xsl:element>
<xsl:element name="citta" namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:value-of select="row/col[3]"/>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xsl fs" version="2.0"
xmlns:fs="http://www.w3.org/2005/xpath-functions"
xmlns:gv="http://www.greenvulcano.it/greenvulcano"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output encoding="utf-8" indent="yes" method="xml"/>
<xsl:template match="/">
<xsl:element name="anagrafica" namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:for-each select="/RowSet/data">
<xsl:element name="persona"
namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:element name="cognome"
namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:value-of select="row/col[1]"/>
</xsl:element>
<xsl:element name="nome"
namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:value-of select="row/col[2]"/>
</xsl:element>
<xsl:element name="citta"
namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:value-of select="row/col[3]"/>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Other Properties:
- mode: allow an element to be processed multiple times, each time producing a different result.
- condition: boolean condition applied to template, condition is a drop list of all the condition that have been defined in the transformation
- priority: priority of a template rule is specified by the priority attribute on the template rule.
If you need to map the node and add a value you can use the link-and-value
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xsl fs" version="2.0"
xmlns:fs="http://www.w3.org/2005/xpath-functions"
xmlns:gv="http://www.greenvulcano.it/greenvulcano"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output encoding="utf-8" indent="yes" method="xml"/>
<xsl:template match="/">
<xsl:element name="anagrafica" namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:element name="cliente">
<xsl:value-of select="col"/>
<xsl:element name="cognome"
namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:value-of select="col[1]"/>
</xsl:element>
<xsl:element name="nome"
namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:value-of select="col[3]"/>
</xsl:element>
<xsl:element name="citta"
namespace="http://www.greenvulcano.it/greenvulcano"/>
<xsl:element name="nomecompleto"
namespace="http://www.greenvulcano.it/greenvulcano">
<xsl:value-of select="col[4]"/>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Functions
Folders on the right of Graphic Editor contains the most common used XSLT and XPath functions, organized by topic.
To use a function is sufficient to select it in the appropriate folder and then to click in the design area. For those functions which have a variable number of parameters, such as the 'concat' function, a dedicated pop-up will open. Once done this steps, a graphical representation of the new function will be shown in the design area.
At this point you need to create all links to map the input parameters and the one to define the element that will assume the output value of the function.
To give a constant value to a function parameter you must right-click on its graphical representation and then insert the value. To modify a parameter value simply set it in the corresponding property in the lower Property editor.
If the desired function is not present inside function folders, it is possible to define it choosing from Custom folder. To do this you must enter values in the following fields:
- Name: the name of the function to create (eg.: java:it.greenvulcano.gvesb.datahandling.utils.GenericRetriever.getData).
- Label: the label displayed on the editor (eg.: getId).
- Numarg: the number of function arguments.
- Prefix: the namespace prefix used by the function (example: java).
- Namespace: the namespace of the function (eg.: http://xml.apache.org/xalan/java)
The following table presents some XSL helper classes, useful in XSL data manipulation:
Helper | Use this for ... |
---|---|
XSLTUtils | manipulate date/time and strings |
GenericRetriever | query the database for data conversion |
JavaScriptRetriever | execute JavaScript code |
You can assign a constant value parameter of a function between right-clicking the mouse on the parameter
Conditional Processing with if
There are two ways to insert an if statement:
- Using the if statement as function
- Inserting the condition as a property of a link
If the function is used when you want to insert an condition mapping of a complex node.
<xsl:element name="anagrafica">
<xsl:if test="/RowSet/data/row/col[1] = string('Romano')">
<xsl:for-each select="/RowSet/data/row/col[1]">
<xsl:element name="cliente">
<xsl:element name="cognome">
<xsl:value-of select="concat(null,/RowSet/data/row/col[2],/RowSet/data/row/col[3])"/>
</xsl:element>
<xsl:element name="nome"/>
<xsl:element name="citta"/>
<xsl:element name="nomecompleto"/>
</xsl:element>
</xsl:for-each>
</xsl:if>
</xsl:element>
Use the property when you want to map a simple node
<xsl:element name="cliente">
<xsl:if test="/RowSet/data/row/col[1] = 'Romano'">
<xsl:element name="cognome">
<xsl:value-of select="/RowSet/data/row/col[1]"/>
</xsl:element>
</xsl:if>
</xsl:element>
</xsl:element>
Conditional Processing with choose
The choose element selects one among a number of possible alternatives.
<xsl:template match="/">
<xsl:element name="anagrafica">
<xsl:apply-templates select="/RowSet/data/row"/>
</xsl:element>
</xsl:template>
<xsl:template match="/RowSet/data/row">
<xsl:element name="cliente">
<xsl:choose>
<xsl:when test="position() = 1">
<xsl:element name="cognome">
<xsl:value-of select="col"/>
</xsl:element>
</xsl:when>
<xsl:when test="col[1] = col[2]">
<xsl:element name="cognome">
<xsl:value-of select="col[1]"/>
</xsl:element>
</xsl:when>
<xsl:when test="count(col) > 0">
<xsl:element name="cognome">
<xsl:value-of select="col[3]"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="cognome">
<xsl:value-of select="col[4]"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
<xsl:element name="nome"/>
<xsl:element name="citta">
<xsl:value-of select="col[2]"/>
</xsl:element>
</xsl:element>
</xsl:template>
Filter
There are two ways to insert an filter:
- Using the filter statement as function
- Inserting nodes with the right mouse button
If you enter without condition filters you can use the first method.
<xsl:template match="/">
<xsl:element name="anagrafica">
<xsl:apply-templates select="/RowSet/data/row"/>
<xsl:element name="cliente">
<xsl:element name="cognome"/>
<xsl:element name="nome"/>
<xsl:element name="citta"/>
<xsl:element name="citta">
<xsl:value-of select="concat(/RowSet/data/row/col[1],/RowSet/data/row[1]/col[2])"/>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
If you enter concondition filters you can use the second method.
<xsl:template match="/">
<xsl:element name="anagrafica">
<xsl:apply-templates select="/RowSet/data/row"/>
</xsl:element>
</xsl:template>
<xsl:template match="/RowSet/data/row">
<xsl:element name="cliente">
<xsl:element name="cognome"/>
<xsl:for-each select="col[position() = 1]">
<xsl:element name="nome">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
<xsl:element name="citta">
<xsl:value-of select="."/>
</xsl:element>
</xsl:element>
</xsl:template
Variables
To enter a variable in the transformation use the function variable in tab Core.
<xsl:template match="/">
<xsl:element name="anagrafica">
<xsl:apply-templates select="/RowSet/data/row"/>
</xsl:element>
</xsl:template>
<xsl:template match="/RowSet/data/row">
<xsl:variable name="var" select="concat(col[1],col[2])"/>
<xsl:element name="cliente">
<xsl:element name="cognome">
<xsl:value-of select="$var"/>
</xsl:element>
<xsl:element name="nome">
<xsl:value-of select="$var"/>
</xsl:element>
<xsl:element name="citta">
<xsl:value-of select="col[3]"/>
</xsl:element>
</xsl:element>
</xsl:template>
Parameter
To enter a parameter in the transformation use the function parameter. Name is the name of the parameter, and value is the default value.
<xsl:element name="anagrafica">
<xsl:element name="cliente">
<xsl:element name="cognome">
<xsl:value-of select="$param"/>
</xsl:element>
<xsl:element name="nome"/>
<xsl:element name="citta"/>
<xsl:element name="nomecompleto"/>
</xsl:element>
</xsl:element>
Parameter template
To defines the value of a parameter to be passed into a template must use the paramtemplate function.
<xsl:param name="paramname" select="'value'"/>
<xsl:template match="/">
<xsl:element name="anagrafica">
<xsl:apply-templates select="/RowSet/data/row/col">
<xsl:with-param name="paramname" select="value"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="/RowSet/data/row/col">
<xsl:param name="paramname"/>
<xsl:element name="cliente">
<xsl:element name="cognome">
<xsl:value-of select="$paramname"/>
</xsl:element>
<xsl:element name="nome">
<xsl:value-of select="/RowSet/data/row/col[2]"/>
</xsl:element>
<xsl:element name="ente">
<xsl:value-of select="/RowSet/data/row/col[3]"/>
</xsl:element>
</xsl:element>
</xsl:template>
Additional nodes
Some XSL transformations need to create nodes by duplicating the base node. To realize this operation, simply select the base node with the right mouse button and then a new duplicate node will be created. An ordinal value will be reported next to the new selected node. A node with an 'n' ordinal value represents the only n-th instance of that node. A node without ordinal values represents all the nodes of that type.
Xsl file generation
To generate the xsl file you must select the 'xsl Save File' menu item icon on the editor tool bar. The file will be created in the subsequently selected directory.