472,782 Members | 1,061 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,782 software developers and data experts.

XSLT for WSDL reduction

I'm trying to select a subset of a WSDL document using XSLT and a
simple text document describing the high-level elements to include. I
have it working fine for selecting the services, bindings, portTypes,
and messages to use. But I'm stumped on how to get the xs:simpleType
and xs:complexType elements filtered properly. I am not trying to do
this in a generic way. The WSDL is generated by a tool in our backend
system, and I know a fair bit about its structure, although I have no
control over it.

I am neither a novice nor an expert with XSLT. I don't use it much,
though, and I'm sure it shows. Any advice would be appreciated. If I
have to resort to doing this in code, I will, but I thought XSLT would
be up to the job...

I posted a sample WSDL with only one high-level service in it. It
represents both the input and the expected output format:

http://scott.sauyet.com/issues/2007-05-24/temp.wsdl
I import the text file (a whitespace separated list of service names)
and store it in a string simply by

<!DOCTYPE xsl:stylesheet [
<!ENTITY service-list SYSTEM "services.txt">
]>

<xsl:variable name="list">
<xsl:call-template name="normalize">
<xsl:with-param name="data">&service-list;</xsl:with-
param>
</xsl:call-template>
</xsl:variable>

<xsl:template name="normalize">
<xsl:param name="data" />
<xsl:value-of select="concat(normalize-space($data), ' ')" />
</xsl:template>

And I use a similar technique to define "service-list", which is the
same list with "Service" appended to each name.

Inside my main template, I can then use this to define the services to
choose:

<xsl:for-each select="wsdl:service">
<xsl:if test="contains($service-list, @name)">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>

And I can select portTypes just as simply:

<xsl:for-each select="wsdl:portType">
<xsl:if test="contains($list, @name)">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>

Bindings are slightly more complex:

<xsl:for-each select="wsdl:binding">
<xsl:variable name="bindName" select="concat('tns:', @name)"/>
<xsl:if test="count(../wsdl:service/wsdl:port[@binding=
$bindName and contains($service-list, ../@name)]) 0">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>

And messages are getting scary:

<xsl:for-each select="wsdl:message">
<xsl:variable name="messName" select="concat('tns:', @name)"/>
<xsl:if test="count(../wsdl:portType/wsdl:operation/
wsdl:input[@message=$messName and contains($list, ../../@name)] | ../
wsdl:portType/wsdl:operation/wsdl:output[@message=$messName and
contains($list, ../../@name)]) 0">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>

But I can't really figure out any way to get to, say, the complexTypes
required. What I want, in essence, is to display a complex type C
if there is a message M with a part P where P/@type = C.name and there
exists a portType T with an operation O with an input I where I/
@message = M/@name. (And this is a simplification?!) But I can't see
how to express that in XPath.

Any suggestions?

Thanks,

-- Scott Sauyet

May 24 '07 #1
2 3728
Ixa
But I can't really figure out any way to get to, say, the complexTypes
required.
Just use the same method as with others: XPath predicates for
appropriate elements.
to display a complex type C
So, use normal XPath to get those elements and store name to variable.

---8<---8<---
<xsl:for-each select="/wsdl:definitions/wsdl:types/xs:schema/xs:complexType">
<xsl:variable name="C.name" select="concat('ro:', @name)"/>
---8<---8<---
if there is a message M with a part P where P/@type = C.name and there
exists a portType T with an operation O with an input I where
I/@message = M/@name
Use two predicates:

* verify that there is a message that has the same name
* verify that there is an equal message elsewhere

---8<---8<---
<xsl:if test="/wsdl:definitions/wsdl:message[wsdl:part/@type =
$C.name][concat('tns:', @name) =
/wsdl:definitions/wsdl:portType/wsdl:operation/wsdl:input/@message]">
---8<---8<---

--
Ixa

May 27 '07 #2
On May 26, 2:09 am, Ixa <i...@niksula.hut.fiwrote:
<xsl:for-each select="/wsdl:definitions/wsdl:types/xs:schema/xs:complexType">
<xsl:variable name="C.name" select="concat('ro:', @name)"/>
if there is a message M with a part P where P/@type = C.name and there
exists a portType T with an operation O with an input I where
I/@message = M/@name

Use two predicates:

* verify that there is a message that has the same name
* verify that there is an equal message elsewhere
I just noted that my very long response to this from earlier in the
week managed to disappear.

Thank you for your help, Ixa. I did settle on a different solutions,
but I learned some techniques from yours.

-- Scott

May 31 '07 #3

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

24
by: Generic Usenet Account | last post by:
Does anyone have an opinion on how IDL and WSDL compare to each other? Are they equally powerful in their "expressive power"? Sometimes it appears to me that IDL is a little easier for humans to...
4
by: Ringo Langly | last post by:
Hi all, I'm a seasoned web programmer, but I've never touched XSLT. It's always been one of those acronyms I've never needed to educate myself on. Now... we're working with a web content...
1
by: ffhansix | last post by:
Hi, I am having problems with generating a c# proxy class from a IBM websphere WSDL file, when running the wsdl.exe to create the c# proxy file command i recieve an error: Warning: one or...
0
by: Elhanan | last post by:
hi.. i have a small Web Service which is consumed by dotnet application the webservice is located in 2 places. the first is my local tomcat, and the second is in websphere server. problems is...
9
by: Cesar | last post by:
Hello there, A java programmer sent me a wsdl file, which I have to use to consume his web methods. When I run the wsld.exe tool to generate the class' code, I get the following message: ...
5
by: Nick K. | last post by:
I use wsdl.exe to generate client code to call a web service. The actual web service is generated with the BizTalk Web Services Publishing Wizard. I'm not sure this is particular to the BizTalk...
11
by: =?ISO-8859-1?Q?Jean=2DFran=E7ois_Michaud?= | last post by:
Context: I'm trying to compare XML tree fragments and I'm doing so by outputting the attributes of each element in the tree and outputting it to a string then normalizing the strings. Then I'm...
2
by: astroboiii | last post by:
New to the whole xml thing and finding w3schools to be an excellent resource. Now down to my question: I have several xml files I need to parse through and grab relevant information from and...
1
by: javajavajava | last post by:
Hi every body, can anyone give me a sample for converting WSDL file with XSLT to html format? can you give me both WSD file sample and XSLT file? Best, javajavajava
0
by: Rina0 | last post by:
Cybersecurity engineering is a specialized field that focuses on the design, development, and implementation of systems, processes, and technologies that protect against cyber threats and...
0
by: erikbower65 | last post by:
Using CodiumAI's pr-agent is simple and powerful. Follow these steps: 1. Install CodiumAI CLI: Ensure Node.js is installed, then run 'npm install -g codiumai' in the terminal. 2. Connect to...
0
linyimin
by: linyimin | last post by:
Spring Startup Analyzer generates an interactive Spring application startup report that lets you understand what contributes to the application startup time and helps to optimize it. Support for...
0
by: erikbower65 | last post by:
Here's a concise step-by-step guide for manually installing IntelliJ IDEA: 1. Download: Visit the official JetBrains website and download the IntelliJ IDEA Community or Ultimate edition based on...
0
by: Taofi | last post by:
I try to insert a new record but the error message says the number of query names and destination fields are not the same This are my field names ID, Budgeted, Actual, Status and Differences ...
0
by: Rina0 | last post by:
I am looking for a Python code to find the longest common subsequence of two strings. I found this blog post that describes the length of longest common subsequence problem and provides a solution in...
0
by: lllomh | last post by:
Define the method first this.state = { buttonBackgroundColor: 'green', isBlinking: false, // A new status is added to identify whether the button is blinking or not } autoStart=()=>{
0
by: lllomh | last post by:
How does React native implement an English player?
0
by: Mushico | last post by:
How to calculate date of retirement from date of birth

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.