Actually, XSLT support began in version 4.2. You can use xslt-eval() if
you want to put the code inline in your XQuery. It requires some
boilerplate, but the germane code (strip out <b> elements) is on one line:

declare variable $xslt :=
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

  <!-- Strip out <b> elements -->
  <xsl:template match="b"/>

  <!-- But copy everything else unchanged -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>;

for $doc in collection() return xdmp:xslt-eval($xslt,$doc)



Evan Lenz
Software Developer, Community
MarkLogic Corporation
http://community.marklogic.com



On 6/14/12 11:21 AM, "David Lee" <[email protected]> wrote:

>Unfortuantely that doesnt return the <doc> element ...
>Its more tricky to exclude children but maintain the parent.
>let $m :=
>  <doc>
>    <a>a</a>
>    <b>b</b>
>  </doc>
>return $m/node() except $m/b
>
>Simply returns 
>  <a>a</a>
>
>First, if you know how to do this in XSLT then ML 5.0+ supports XSLT so
>just use that. 
>
>For pure XQuery its a bit more complex in the general case (arbitrary
>deep elements).  FunctX might come to your rescue:
>
>http://www.xqueryfunctions.com/xq/functx_remove-elements.html
>-----
>
>import module namespace functx = "http://www.functx.com"; at
>"/MarkLogic/functx/functx-1.0-nodoc-2007-01.xqy";
>
>let $m :=
>  <doc>
>    <a>a</a>
>    <b>b</b>
>  </doc>
>return functx:remove-elements($m,"b")
>
> Result:
><doc>
>  <a>a</a>
></doc>
>
>
>
>
>
>
>> -----Original Message-----
>> From: [email protected] [mailto:general-
>> [email protected]] On Behalf Of Damon Feldman
>> Sent: Thursday, June 14, 2012 2:15 PM
>> To: MarkLogic Developer Discussion
>> Subject: Re: [MarkLogic Dev General] How to exclude some elements from
>> marklogic xquery output?
>> 
>> 
>> For anyone not familiar with self:: it is an XPath axis
>> (http://www.w3schools.com/xpath/xpath_axes.asp). Another common idiom
>> for this is to use the "except" keyword;
>> 
>> let $m :=
>>   <doc>
>>     <a>a</a>
>>     <b>b</b>
>>   </doc>
>> return $m/node() except $m/b
>> 
>> 
>> Yours,
>> Damon
>> 
>> -----Original Message-----
>> From: [email protected] [mailto:general-
>> [email protected]] On Behalf Of Erik Hennum
>> Sent: Thursday, June 14, 2012 10:49 AM
>> To: MarkLogic Developer Discussion
>> Subject: Re: [MarkLogic Dev General] How to exclude some elements from
>> marklogic xquery output?
>> 
>> Hi, Karthik:
>> 
>> Basically, you need to construct a new version of the doc root element
>> that doesn't have the b child element but has all other child nodes.  If
>> it is just a single exclusion, a simple predicate might be best:
>> 
>> xquery version "1.0-ml";
>> for $m in fn:doc()
>> return document {
>>     <doc>{
>>         $m/doc/node()[empty(self::b)]
>>     }</doc>
>> }
>> 
>> If you need to exclude lots of stuff, you're probably better off with
>>typeswitch:
>> 
>> xquery version "1.0-ml";
>> for $m in fn:doc()
>> return document {
>>     <doc>{
>>         for $node in $m/doc/node()
>>         return typeswitch($node)
>>             case element(b) return ()
>>             default return $node
>>     }</doc>
>> }
>> 
>> 
>> Hoping that's useful,
>> 
>> 
>> Erik Hennum
>> 
>> ________________________________________
>> From: [email protected] [general-
>> [email protected]] On Behalf Of
>> [email protected] [[email protected]]
>> Sent: Thursday, June 14, 2012 7:25 AM
>> To: [email protected]
>> Subject: [MarkLogic Dev General] How to exclude some elements from
>> marklogic    xquery output?
>> 
>> Hi,
>> 
>> I want to exclude some elements from xquery output..
>> For ex: if I have many documents with the following xml ,
>> <doc>
>>                 <a>a</a>
>>                 <b>b</b>
>> </doc>
>> 
>> I want to return all the documents, but element <b> must be excluded in
>>all
>> these documents.
>> 
>> for $m in fn:doc()
>> return $m
>> 
>> Above xquery will return all the documents as it is. Can someone please
>>let me
>> know how to exclude only element <b> before returning the document. Is
>> there any xquery or marklogic function readily available to ignore some
>> elements while returning the response? I know that we can easily
>>achieve this
>> using XSLT. But, is it possible using Xquery or marklogic function?
>> 
>> 
>> Thanks and Regards,
>> Karthik
>> 
>> This e-mail and any files transmitted with it are for the sole use of
>>the
>> intended recipient(s) and may contain confidential and privileged
>>information.
>> If you are not the intended recipient(s), please reply to the sender
>>and destroy
>> all copies of the original message. Any unauthorized review, use,
>>disclosure,
>> dissemination, forwarding, printing or copying of this email, and/or
>>any action
>> taken in reliance on the contents of this e-mail is strictly prohibited
>>and may
>> be unlawful.
>> _______________________________________________
>> General mailing list
>> [email protected]
>> http://community.marklogic.com/mailman/listinfo/general
>> _______________________________________________
>> General mailing list
>> [email protected]
>> http://community.marklogic.com/mailman/listinfo/general
>_______________________________________________
>General mailing list
>[email protected]
>http://community.marklogic.com/mailman/listinfo/general

_______________________________________________
General mailing list
[email protected]
http://community.marklogic.com/mailman/listinfo/general

Reply via email to