Subject: [xsl] Re: Querying an Active Directory memberOf Attribute From: yguaba@xxxxxxxxxxxx Date: Wed, 02 Aug 2006 11:27:32 -0300 |
On 1 Aug 2006 at 16:48, Cailo wrote: > My problem is that because memberOf is an array within AD, the query is > only searching the first 'string' of the array and hence not returning > correct results. What I would like to do is to either query the entire > array or join each string within the array to create one long string, > then query the string. Please see below my script: > > <xsl:template match="rf:attr[@name='memberOf']"> > <attr name="GroupID"> > <value> > <xsl:variable name="group" select="*" /> > <xsl:choose> > <xsl:when test="contains($group,'Group_1')">100663298</xsl:when> > <xsl:when test="contains($group,'Group_2')">100663299</xsl:when> > <xsl:otherwise><xsl:value-of select="100663296" /></xsl:otherwise> > </xsl:choose> > </value> > </attr> > </xsl:template> It's not clear to me whether $group is populated with a string or a node set. Contains() always verifies the existence of a substring within another string; it's not, as Michael Kay pointed out in other words, an equivalent of PHP's in_array() or JavaScript's "if (var prop in obj)". > I have done this previously with javascript and it worked fine however I > am unable to get this to work. Please see below the javascript: > > Dim strGroups > If IsArray(varProp) Then > strGroups = (Join(varProp)) > If (InStr(strGroups, "CN=Group_1") > 0 ) Then > objUser.IsUnprotected = 0 > objUser.GroupID="Orlando" > End If > End If I imagine you mean the above is pseudo-code for your actual JavaScript. Well, JavaScript is a *very* different animal from XSLT. Anyway, in the bit of code above it seems that you're checking for the existence of "CN=Group_1" within strGroups, which in turn seems to be the result of the concatenation of all varProps. This can be done in XSLT; perhaps your problem is that you're doing something wrong when trying to concatenate all the strings. As for using a node set as a kind of array and checking for the existence of the desired substring in the text value of each node (in this case, the equivalent of an array element), you need a mechanism to cicle through all the nodes in the node set (all the "elements" in the "array"). Otherwise, only the first node will be checked. To do that, you'll need a recursive template, i.e. a template that calls itself until all the nodes in the node set have been checked. Here's a very simple example, just so you can understand the idea: ============== test.xml --------------------------- <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="test.xsl"?> <root> <array> <elem key="0">apple</elem> <elem key="1">banana</elem> <elem key="2">cherry</elem> <elem key="3">orange</elem> <elem key="4">raspberry</elem> <elem key="5">watermelon</elem> </array> <search> <item>banana</item> <item>orange</item> </search> </root> ============== ============== test.xsl --------------------------- <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/1999/XSL/Transform http://www.w3.org/2004/11/schema-for-xslt20.xsd"> <xsl:output method="html" indent="yes" encoding="utf-8"/> <xsl:template match="/"> <html> <head> <title>Results</title> </head> <body> <xsl:apply-templates select="//search"/> </body> </html> </xsl:template> <xsl:template match="search"> <xsl:call-template name="in-array"> <xsl:with-param name="haystack" select="/root/array/elem"/> <xsl:with-param name="needle" select="item"/> </xsl:call-template> </xsl:template> <xsl:template name="in-array"> <xsl:param name="haystack"/> <xsl:param name="needle"/> <xsl:if test="$haystack and $haystack[1]"> <xsl:if test="$needle = $haystack[1]"> <p>Match: item <xsl:value-of select="$haystack[1]/@key"/></p> </xsl:if> <xsl:call-template name="in-array"> <xsl:with-param name="haystack" select="$haystack[position() > 1]"/> <xsl:with-param name="needle" select="$needle"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet> ============== My apologies if I misunderstood the nature of your problem. And although I believe the example above can help you solve your problem, it's possible that my preceding considerations are not entirely accurate. I'm not Michael Kay! ;o) Erik _______________________________________________________ Vocj quer respostas para suas perguntas? Ou vocj sabe muito e quer compartilhar seu conhecimento? Experimente o Yahoo! Respostas ! http://br.answers.yahoo.com/
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Design of inheritance in , Michael Kay | Thread | Re: [xsl] Re: Querying an Active Di, Wendell Piez |
RE: [xsl] Design of inheritance in , Michael Kay | Date | [xsl] Re: For-each and keys(), Steve |
Month |