xsl-list
[Top] [All Lists]

Re: [xsl] xsl transform on xml with namespaces returns no output

2009-08-06 07:17:56
Raveendran, Reshma wrote:

I want to apply xsl on the xml below to get a transformed xml as shown
below.

Source xml ---

 <input xmlns="http://tempuri.org/";>
  <InputParams
xmlns="http://schemas.datacontract.org/2004/07/GenericQuery";>
        <anyType xsi:type="q1:ResultSpecPagination"
xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays";
xmlns:q1="urn:cbc:message"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
<PageSize xmlns="">10</PageSize> </anyType>
  <anyType xsi:type="q2:AccountFilter"
xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays";
xmlns:q2="urn:cbc:clientinfo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
 <AccountFilter xmlns="">
<O>101</O> <F>173</A> </AccountFilter>
  </anyType>
  <anyType xsi:type="xsd:string"
xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>677</anyType> <anyType xsi:type="xsd:string"
xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>A</anyType> </InputParams>
  </input>
Expected Result:
-  <pSearch xmlns="http://tempuri.org/";>
- <p1>
<PageSize xmlns="">10</PageSize> </p1>
- <p2>
-<AccountFilter xmlns="">
<O>101</O> <F>173</F> </AccountFilter>
  </p2>
<p3>677</p3> <p4>A</p4> </pSearch>

With XSLT 2.0 you can prevent namespaces from being copied:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  xmlns:df="http://tempuri.org/";
  xmlns="http://tempuri.org/";
  xmlns:gq="http://schemas.datacontract.org/2004/07/GenericQuery";
  xmlns:sa="http://schemas.microsoft.com/2003/10/Serialization/Arrays";
  exclude-result-prefixes="df gq sa"
  version="2.0">

  <xsl:output indent="yes"/>

  <xsl:template match="df:input">
    <pSearch>
      <xsl:apply-templates select="gq:InputParams/sa:anyType"/>
    </pSearch>
  </xsl:template>

  <xsl:template match="sa:anyType">
    <xsl:element name="p{position()}">
<xsl:copy-of select="node()[normalize-space()]" copy-namespaces="no"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

That should do what you want.

--

        Martin Honnen
        http://msmvps.com/blogs/martin_honnen/

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>