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
