Project Siena: Creating a WADL Configuration File
Last week we announced Beta2 release of Project Siena where we unveiled our mission to make consuming services as easy as an Excel function. Please see S. Somasegar's blog post for more details.
In this topic we want to share how we are simplifying consumption of these Services. If you are a developer of a REST-based service, this article is for you. It introduces the basic concepts and building blocks necessary to describe your service and its resources for your business users. Once described, business users can connect and consume these services as functions within Siena by simply importing them. This article assumes you have experience with basic HTTP and XML concepts involved in web development.
A REST-based service comprises of a resource and the methods you can call on it. Below is a sample schema for a service description using Web Application Description Language (WADL):
<application>
<siena:header/>
<resources>
<resource>
<method>
<request/>
<response/>
</method>
</resource>
</resources>
</application>
Let's walk through describing the sample schema and it's components using WADL.
Application and Siena Header
The <application> element forms the root of a WADL description. This is how you start a WADL description for your service. Here's an example of a sample <application> element:
<application xmlns="http://wadl.dev.java.net/2009/02"
xmlns:siena="http://schemas.microsoft.com/MicrosoftProjectSiena/v1/WADL"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xh="http://www.w3.org/1999/xhtml"
>
The <siena:header> element is used to describe the file and format version for the service description. Here's an example of a sample <siena:header> element:
<siena:header serviceid="BingTranslator" author="ProjectSiena" fileversion="1.0" formatversion="1.0" />
Attribute | Description | Required/Optional |
serviceid | The namespace under which this functionality will be imported. | Required |
author | The creator of this file. | Required |
formatversion | The version of the current file format. | Optional |
fileversion | The version of the current file. | Optional |
The <application> and <siena:header> elements are required.
Resources
When accessing a REST resource, a typical starting point is a Resource URI also known as a REST endpoint. For example, here are some REST service Resource URI's for Bing Translator:
- http://api.microsofttranslator.com/v2/Http.svc/Speak
- http://api.microsofttranslator.com/v2/Http.svc/Translate
In WADL, the <resources> and <resource> elements are used to describe a Resource URI. The complete path name of the resource is generated by concatenating the value of the base attribute in the <resources> element and the value of the path attribute in the <resource> element.
The <resources> element contains one attribute, base, that defines the domain and the base path of the URI. Here's an example of a resources element for the Bing Search service:
<resources base="http://api.microsofttranslator.com/v2/Http.svc/">
…
</resources>
Resource
Each <resources> element contains one or more <resource> elements. A <resource> element has a path attribute that specifies the path to that resource, relative to the resources' base url. The following are two examples of <resource> elements for the Bing Translator service:
<resources base="http://api.microsofttranslator.com/v2/Http.svc/">
<resource path="Speak">…</resource>
<resource path="Translate">…</resource>
</resources>
The above <resources> element and nested <resource> elements together describe the following Resource URI's:
http://api.microsofttranslator.com/v2/Http.svc/Speak
http://api.microsofttranslator.com/v2/Http.svc/Translate
<param> (as a child of <resource>)
The value of the path attribute on <resource> element can be static, or it can be templated and described using a <param> element. Here's an example of a templated path attribute ({userid}) for describing Photo Albums for a specific Facebook user:
<resources base="https://graph.facebook.com">
<resource path="{userid}/albums">
<param style="template" name="userid" required="true" siena:sampledefault="me"/>
…
</resource>
</resources>
The above describes the following Resource URI where userid is templated:
https://graph.facebook.com/{userid}/albums
The common attributes used for <param> elements directly under the <resource> element:
Attribute | Description | Required/Optional |
style | Defines where the param's value should be placed in the corresponding HTTP request. Only "template" value is supported in Beta2.- template: The value is placed in the path section of the <resource> element using the 'name' as the key. |
Required |
name | The name of the template param. | Required |
type | Defaults to string. The type of the value as expected by the server. Any value passed into the function will be converted to a value of that type before being added to the HTTP request. |
Optional |
required | Defaults to false. When true, it indicates that the param is required to be specified. If no value is given to the param via the fixed attribute, Siena will require this param by adding an explicit parameter for the function. |
Optional |
fixed | The value to use for the param. Siena will not allow the author to specify or override this value and will always be used when creating the HTTP request. | Optional |
siena:sampledefault |
Defaults to false. This is a custom flag that tells Siena to use as the default value for the 'Try It' functionality in the backstage. | Optional |
We will talk more about <param> as part of the <request> element.
Methods
Methods associated with a REST resource are described using the <method> element. A <resource> element can have one or more <method> elements as its children.
The <method> element basically describes an HTTP protocol method that can be applied to the REST resource.
Attribute | Description | Required/Optional |
id | The unique identifies for this method | Required |
name | The type of HTTP method used. Supported values are: GET, POST, DELETE or PUT | Required |
Here's an example of a <method> element for Bing Search:
<resources base="http://api.microsofttranslator.com/v2/Http.svc/">
<resource path="Speak">
<method name="GET" id="Speak">
….
</method>
</resource>
</resources>
Each described method is displayed as a function within Siena once the services description is imported.
Request
A <request> element is used to describe the input for an HTTP Method. It is a required child element of a <method> element.
Param (as a child of <request>)
The <request> element contains 1 or more child <param> elements that are used to define the input parameters of an HTTP request. The following are two examples of <param> elements as children of a <request> element for Bing Translator and Bing Search:
Translator
<resources base="http://api.microsofttranslator.com/v2/Http.svc/">
<resource path="Speak">
<method name="GET" id="Speak">
<request>
…
<param name="text" style="query" required="true" siena:sampledefault="welcome"/>
<param name="language" style="query" required="true" siena:sampledefault="en"/>
<param name="format" style="query" required="false"/>
<param name="options" style="query" required="false"/>
</request>
….
</response>
</method>
</resource>
</resources>
Search
<resources base="https://api.datamarket.azure.com/Bing/Search/v1/">
<resource path="Web">
<method name="GET" id="Web">
<request>
<param style="header" name="Authorization" required="true" fixed="l2kje2lejsorjsoefjsrlginsrfl8="/>
<param style="header" name="Accept" required="true" fixed="application/json"/>
<param style="header" name="Accept-Charset" required="true" fixed="UTF-8"/>
<param style="query" name="Query" required="true" siena:quoted="single"/>
<param style="query" name="$top" type="xs:int" required="false"/>
<param style="query" name="$skip" type="xs:int" required="false"/>
</request>
….
</response>
</method>
</resource>
</resources>
Attribute | Description | Required/Optional |
style | Defines where the param's value should be placed in the corresponding HTTP request. - header: The value is placed in the header section of the request using the 'name' as the key. - query: The value is placed as a query parameter on the url sent to the server. |
Required |
name | The name of the query parameter or header. | Required |
type | Defaults to string. The type of the value as expected by the server. Any value passed into the function will be converted to a value of that type before being added to the HTTP request. |
Optional |
required | Defaults to false. When true, it indicates that the param is required to be specified. If no value is given to the param via the fixed attribute, Siena will require this param by adding an explicit parameter for the function. |
Optional |
fixed | The value to use for the param. Siena will not allow the author to specify or override this value and will always be used when creating the HTTP request. | Optional |
siena:quoted |
This is a custom flag that tells Siena to wrap the value of the argument with single quotes. | Optional |
Representation (as a child of <request>)
A <representation> element is used to describe the body of the input of a HTTP request. Here's an example of the <representation> element:
<representation mediaType="application/json">
<param style="plain" name="name" required="true" path="/name" fixed="John Doe" />
<param style="plain" name="title" required="true" path="/title" fixed="Sales" />
<param style="plain" name="homephone" required="true" path="/phones/home" fixed="555-0001" />
<param style="plain" name="workphone" required="true" path="/phones/work" fixed="555-0002" />
</representation>
The above <representation> element would produce the following JSON data in the request body. This is how JSON data can be sent as the body of an HTTP request:
{
"name": "John Doe",
"title": "Sales",
"phones": {
"home": "555-0001"
"work": "555-0002"
}
}
Attribute | Value | Description | Optional/Required |
mediatype | The HTTP media type (or content type) of the request. | ||
multipart/form-data |
|
||
application/x-www- form-urlencoded |
|
||
application/json |
|
Here's an example of how to send multipart form-data as the body of the HTTP request for UploadPhoto method in Facebook:
<resource path="{userid}/photos">
<param name="userid" style="template" required="true"/>
<method name="POST" id="UploadPhoto" siena:disabletryit="true">
<request>
….
<representation mediaType="multipart/form-data">
<param name="source" style="query" type="xs:base64Binary" siena:type="image" required="true"/>
<param name="message" style="query" required="false"/>
<param name="placeid" style="query" required="false" />
<param name="no_story" style="query" type="xs:boolean" required="false" />
</representation>
</request>
…..
</method>
</resource>
</resources>
Attribute | Value | Description | Optional/Required |
siena:type | The type of the data as interpreted by Siena. This is required when the parameter type is Base64Binary | Required | |
image | The data will be interpreted as an image binary data. | ||
audio | The data will be interpreted as an audio binary data. |
Response
A response is the output that results from performing an HTTP method on a REST resource. A <response> element is used to describe the output. The following are two examples of a <response> element for Bing Search and Bing Translator:
Search
<resources base="https://api.datamarket.azure.com/Bing/Search/v1/">
<resource path="Web">
<method name="GET" id="Web">
<request>
<param style="header" name="Authorization" required="true" fixed="l2kje2lejsorjsoefjsrlginsrfl8="/>
<param style="header" name="Accept" required="true" fixed="application/json"/>
<param style="header" name="Accept-Charset" required="true" fixed="UTF-8"/>
<param style="query" name="Query" required="true" siena:quoted="single"/>
<param style="query" name="$top" type="xs:int" required="false"/>
<param style="query" name="$skip" type="xs:int" required="false"/>
</request>
<response siena:resultform="single">
……
</response>
</method>
</resource>
</resources>
Translator
<resources base="http://api.microsofttranslator.com/v2/Http.svc/">
<resource path="Speak">
<method name="GET" id="Speak">
<request>
<siena:auth href="#dataMarketAuth"/>
<param name="text" style="query" required="true" siena:sampledefault="welcome"/>
<param name="language" style="query" required="true" siena:sampledefault="en"/>
<param name="format" style="query" required="false"/>
<param name="options" style="query" required="false"/>
</request>
<response siena:resultform="self">
…
</response>
</method>
</resource>
</resources>
Attribute | Value | Description | Optional/Required |
siena:resultform | Indicates one of four forms the result of the function should take and how child param elements should be used. | Optional | |
void | Default. Used when the REST API is not expected to return any consumable data. | ||
self | The full response body is returned. For example, when the body returned is an image or media file. Indicates a single typed value is extracted from the body of the response. |
||
single | This value is specified via the single param element allowed within the response element. Indicates multiple typed values should be extracted from the body of the response. |
||
aggregate | This uses one or more param elements to indicate the values to return. |
Representation (as a child of <response>)
A <response> element usually contains child <representation> element. A <representation> element is used to describe the body of the output of a HTTP response. The following are two examples of a <representation> element for Bing Search and Bing Translator:
Search
<resources base="https://api.datamarket.azure.com/Bing/Search/v1/">
<resource path="Web">
<method name="GET" id="Web">
…
<response siena:resultform="single">
<representation mediaType="application/json">
….
</representation>
</response>
</method>
</resource>
</resources>
Translator
<resources base="http://api.microsofttranslator.com/v2/Http.svc/">
<resource path="Speak">
<method name="GET" id="Speak">
<request>
<siena:auth href="#dataMarketAuth"/>
<param name="text" style="query" required="true" siena:sampledefault="welcome"/>
<param name="language" style="query" required="true" siena:sampledefault="en"/>
<param name="format" style="query" required="false"/>
<param name="options" style="query" required="false"/>
</request>
<response siena:resultform="self">
<representation mediaType="audio"/>
</response>
</method>
</resource>
</resources>
Attribute | Value | Description | Optional/Required |
mediaType | The HTTP media type (or content type) of the response. The values supported by Siena are: "image", "audio", "application/json", "application/xml" |
Optional | |
image | Indicates the response is expected to be an image file. Supported resultform values: "self". |
||
audio | Indicates the response is expected to be an audio file. Supported resultform values: "self". | ||
application/json | Indicates the body is JSON data. Supported resultform values: "aggregate", "single". | ||
application/xml | Indicates the body is XML data. Supported resultform values: "aggregate", "single". |
Siena:responsetype
For responses that return complex data, it's necessary to convey the types returned to Siena so it can be exposed to the end user of the function. A <siena:responsetype> element is used to convey this when the mediaType is application/json. The types returned by the response are specified via a CDATA section within the <siena:responsetype> element. Here's an example of CDATA section within a <siena:responsetype> element for Bing Search:
<response siena:resultform="single">
<representation mediaType="application/json">
<siena:responsetype>
<![CDATA[
{
"resultpath": "/d",
"resulttype": "ResultsRoot",
"types": [
{
"name": "Root",
"type": "object",
"fields": [
{
"name": "d",
"type": "ResultsRoot"
}
]
},
{
"name": "ResultsRoot",
"type": "object",
"fields": [
{
"name": "__next",
"type": "hyperlink"
},
{
"name": "results",
"type": "ResultArray"
}
]
},
{
"name": "ResultArray",
"type": "array",
"itemtype": "ResultEntry"
},
{
"name": "Metadata",
"type": "object",
"fields": [
{
"name": "uri",
"type": "hyperlink"
},
{
"name": "type",
"type": "string"
}
]
},
{
"name": "ResultEntry",
"type": "object",
"fields": [
{
"name": "__metadata",
"type": "Metadata"
},
{
"name": "ID",
"type": "string"
},
{
"name": "Title",
"type": "string"
},
{
"name": "Description",
"type": "string"
},
{
"name": "DisplayUrl",
"type": "string"
},
{
"name": "Url",
"type": "hyperlink"
}
]
}
]
}
]]>
</siena:responsetype>
</representation>
</response>
The following example JSON data could be returned in the response body, given the above <responsetype> element:
{
"d": {
"results": [
{
"__metadata": {
"uri": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Web?Query='Xbox One'&$skip=0&$top=1",
"type": "WebResult"
},
"ID": "365476c6-1db2-47fd-ace1-cf4212573dd6",
"Title": "Xbox One | The All-in-one Entertainmernt System from Xbox ...",
"Description": "The all-in-one entertainment system. Where the best games, multiplayer, and your favorite movies, music, sports, and live TV come together in one place.",
"DisplayUrl": "www.xbox.com/xbox-one",
"Url": "http://www.xbox.com/xbox-one/meet-xbox-one"
},
{
"__metadata": {
"uri": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Web?Query='Xbox One'&$skip=1&$top=1",
"type": "WebResult"
},
"ID": "0089a2e8-d676-4313-ac2d-6c609b8cfae5",
"Title": "Xbox One - Wikipedia, the free encyclopedia",
"Description": "Xbox One is the successor to Xbox 360, Microsoft's previous video game console, which was introduced in 2005 as part of the seventh generation of video game consoles.",
"DisplayUrl": "en.wikipedia.org/wiki/Xbox_one",
"Url": "http://en.wikipedia.org/wiki/Xbox_one"
}
],
"__next": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Web?Query='Xbox%20One'&$skip=50"
}
}
Property Description
Property | Type | Description |
resultpath | JSON Pointer | A JSON pointer that identifies where in the body the result should come from. The empty string refers to the root JSON value. |
resulttype | string | The type of the value referred to by the resultpath property. |
types | Array of JSON Object Type Definitions |
An array of type definitions for custom complex types used within the response. |
name | string | The custom name for the type. This is used by other 'type' properties or the 'resulttype' property to refer to this type. |
type | string | One of: "object" - Indicates the type is an extension of a JSON Object. "array" - Indicates the type is an array of a primitive or custom type. |
itemtype |
string | Required when type="array". Specifies the type of each element within the array. It can be either a pre- defined type or a custom type name. |
fields | array | Required when type="object". An array of object defining the name and type of each field for the object. |
fields[i].name | string | Required. The name of the property on the object. |
fields[i].type | string | Required. The name of the type of this property. |
Siena:samplexml
For responses that return complex data, it's necessary to convey the types returned to Siena so it can be exposed to the end user of the function. A <siena:samplexml> element is used to convey this when the mediaType is application/xml. A sample xml returned by the response is specified within the <siena:samplexml> element. Here's an example of a <siena:samplexml> element for Bing Translator:
<response siena:resultform="single">
<representation mediaType="application/xml">
<siena:samplexml>
<GetTranslationsResponse xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<From>es</From>
<Translations>
<TranslationMatch>
<Count>0</Count>
<MatchDegree>100</MatchDegree>
<MatchedOriginalText/>
<Rating>5</Rating>
<TranslatedText>an important contribution to the profitability of the company</TranslatedText>
</TranslationMatch>
<TranslationMatch>
<Count>7</Count>
<MatchDegree>100</MatchDegree>
<MatchedOriginalText>una importante contribución a la rentabilidad de la empresa</MatchedOriginalText>
<Rating>1</Rating>
<TranslatedText>an important contribution to the company profitability</TranslatedText>
</TranslationMatch>
</Translations>
</GetTranslationsResponse>
</siena:samplexml>
</representation>
</response>
Authentication
Certain services require the user to be authenticated in order to perform HTTP methods on REST resources. A <siena:auth> element can be used to describe the authentication mechanism. In Beta2, the support is currently limited to OAuth 2.0 client side flows (implicit and client credentials).
Here's an example of a <siena:auth> element for Bing Translator using "clientcredentials":
<siena:auth id="dataMarketAuth"
type="oauth2"
granttype="clientcredentials"
accesstokenstyle="header"
clientmethodref="#GetToken"/>
Attribute | Description | Required/Optional |
id | A unique identifier for this section | Required |
Type | The type of authentication. Currently only "oauth2" is supported | Required |
granttype | The OAuth2 grant type that the authentication method uses. Currently on "implicit" and "clientcredentials" is supported | Required |
accesstokenstyle | The format of the access token that the service requires. The format defaults to "Bearer:" when the accesstokenstyle value is "header". The format defaults to "access_token" when the accesstokenstyle value is "query". | Required |
clientmethodref | ID of the method which describes the authentication. In the example above, the value "#GetToken" is referring the method "GetToken", which describes the authentication. | Optional |
Here's an example of a <siena:auth> element for Yammer service using "implicit" flow:
<siena:auth id="yammerAuth"
type="oauth2"
granttype="implicit"
accesstokenstyle="header"
authurl="https://www.yammer.com/dialog/oauth"
callbackurl="https://www.microsoft.com"
clientid="1YV1vIZIFUlZYgd2LeZTg"
scope="full"
/>
Attribute | Description | Required/Optional |
id | A unique identifier for this section | Required |
Type | The type of authentication. Currently only "oauth2" is supported | Required |
granttype | The OAuth2 grant type that the authentication method uses. Currently on "implicit" and "clientcredentials" is supported | Required |
accesstokenstyle | The format of the access token that the service requires. The format defaults to "Bearer:" when the accesstokenstyle value is "header". The format defaults to "access_token" when the accesstokenstyle value is "query". | Required |
authurl | The URL for the authorization Resource. | Required |
callbackurl | The redirect URL used to return the access_token | Required |
clientid | The client identifier issued to the client during the registration process with the service. | Required |
scope | The scope of the access request | Depends on the service |
Authentication Method (only required when granttype="clientcredentials")
An authentication method is described similar to a normal REST method using the <method> element. Like any other method, the Resource URI needs to be defined using the <resources> and <resource> parent element. A <request> child element is used to describe the input parameters for service authentication and a <response> child element is used to describe the output returned by the service authentication. In most cases the service authentication returns an access_token along with some other useful information about the token itself such expires_in information regarding the token. Here's an example of authentication method for the Bing Translator service using client_credentials flow:
<resources base="https://datamarket.accesscontrol.windows.net/v2/">
<resource path="OAuth2-13">
<method name="POST" id="GetToken" siena:isauth="true">
<request>
<representation mediaType="application/x-www-form-urlencoded">
<param name="grant_type" style="query" fixed="client_credentials"/>
<param name="client_id" style="query" fixed="1YV1vIZIFUlZYgd2LeZTg"/>
<param name="client_secret" style="query" fixed="xxxxxxxxxxxxxxxxxxx"/>
<param name="scope" style="query" fixed="http://api.microsofttranslator.com"/>
</representation>
</request>
<response siena:resultform="aggregate">
<representation mediaType="application/json">
<param style="plain" name="access_token" path="/access_token"/>
<param style="plain" name="expires_in" path="/expires_in"/>
</representation>
</response>
</method>
</resource>
</resources>
Attribute | Description | Required/Optional |
siena:isauth | A custom attribute that specifies if this method is required for authentication. When not specified it defaults to false. | Required |
Resource Method
Any method associated with a REST resource that requires authentication references the <siena:auth> element to describe the requirement. Here's an example of how the Speak method in Bing Translator service specifies the authentication requirement:
<resource path="Speak">
<method name="GET" id="Speak">
<request>
<siena:auth href="#dataMarketAuth"/>
<param name="text" style="query" required="true" siena:sampledefault="welcome"/>
…
</request>
<response>
…
</response>
</method>
</resource>
Attribute | Description | Required/Optional |
href | URI fragment identifier for the <siena:auth> element to use | Required |
End to End Example
Following the sections described above we are able to create an end to end example of the Bing Translator service describing the Speak and AllTranslations method below. Save this description with a .xml extension using your favorite text editor and you are ready to import and consume these methods within Siena.
<!-- Application
-->
<application xmlns="http://wadl.dev.java.net/2009/02"
xmlns:siena="http://schemas.microsoft.com/MicrosoftProjectSiena/v1/WADL"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xh="http://www.w3.org/1999/xhtml"
>
<!-- Siena Header
-->
<siena:header fileversion="1.0"
formatversion="1.0"
author="ProjectSiena"
serviceid="BingTranslator"
/>
<!-- Authentication
-->
<siena:auth id="dataMarketAuth"
type="oauth2"
granttype="clientcredentials"
accesstokenstyle="header"
clientmethodref="#GetToken"/>
<!-- Authentication Method
-->
<resources base="https://datamarket.accesscontrol.windows.net/v2/">
<resource path="OAuth2-13">
<method name="POST" id="GetToken" siena:isauth="true">
<request>
<representation mediaType="application/x-www-form-urlencoded">
<param name="grant_type" style="query" fixed="client_credentials"/>
<param name="client_id" style="query" fixed="1YV1vIZIFUlZYgd2LeZTg"/>
<param name="client_secret" style="query" fixed="xxxxxxxxxxxxxxxxxxx"/>
<param name="scope" style="query" fixed="http://api.microsofttranslator.com"/>
</representation>
</request>
<response siena:resultform="aggregate">
<representation mediaType="application/json">
<param style="plain" name="access_token" path="/access_token"/>
<param style="plain" name="expires_in" path="/expires_in"/>
</representation>
</response>
</method>
</resource>
</resources>
<!-- Translator Resource and Speak Method
-->
<resources base="http://api.microsofttranslator.com/v2/Http.svc/">
<resource path="Speak">
<method name="GET" id="Speak">
<request>
<siena:auth href="#dataMarketAuth"/>
<param name="text" style="query" required="true" siena:sampledefault="welcome"/>
<param name="language" style="query" required="true" siena:sampledefault="en"/>
<param name="format" style="query" required="false"/>
<param name="options" style="query" required="false"/>
</request>
<response>
<representation mediaType="audio"/>
</response>
</method>
</resource>
<resource path="GetTranslations">
<method name="POST" id="AllTranslations">
<request>
<siena:auth href="#dataMarketAuth"/>
<param name="text" style="query" required="true" siena:sampledefault="una importante contribución a la rentabilidad de la empresa"/>
<param name="from" style="query" required="true" siena:sampledefault="es"/>
<param name="to" style="query" required="true" siena:sampledefault="en"/>
<param name="maxTranslations" style="query" type="xs:int" required="true" siena:sampledefault="5"/>
</request>
<response siena:resultform="single">
<representation mediaType="application/xml">
<siena:samplexml>
<GetTranslationsResponse xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<From>es</From>
<Translations>
<TranslationMatch>
<Count>0</Count>
<MatchDegree>100</MatchDegree>
<MatchedOriginalText/>
<Rating>5</Rating>
<TranslatedText>an important contribution to the profitability of the company</TranslatedText>
</TranslationMatch>
<TranslationMatch>
<Count>7</Count>
<MatchDegree>100</MatchDegree>
<MatchedOriginalText>una importante contribución a la rentabilidad de la empresa</MatchedOriginalText>
<Rating>1</Rating>
<TranslatedText>an important contribution to the company profitability</TranslatedText>
</TranslationMatch>
</Translations>
</GetTranslationsResponse>
</siena:samplexml>
</representation>
</response>
</method>
</resource>
</resources>
</application>