Multi Valued attribute returning values as single String.

Hello All,

I am using Loop Back driver to send email notification to users when the roles assigned to them are about to expire. In the email I need to Publish Role CN, Expiry date and nrfRoleCategorykey (multi-valued attribute in the role). For each role I am fetching nrfRoleCategorykey value using query, as it is multi-valued attribute it is giving all the values as a single concatenated string without any delimiter example as below:
nrfroleCategoryKey: AlphaBetaDelta……. etc.
I want these values with some delimiter as (Alpha, Beta, Delta,...etc).

Below is the code i am using:

<do-set-local-variable name="varRoleCatogeryKey" scope="policy">
<arg-node-set>
<token-query class-name="nrfRole" datastore="src">
<arg-dn>
<token-global-variable name="RolesContainer"/>
</arg-dn>
<arg-match-attr name="CN">
<arg-value type="string">
<token-local-variable name="RoleName"/>
</arg-value>
</arg-match-attr>
<arg-string>
<token-text xml:space="preserve">nrfRoleCategoryKey</token-text>
</arg-string>
</token-query>
</arg-node-set>
</do-set-local-variable>
<do-set-local-variable name="varMultipleRoleCatKeys" scope="policy">
<arg-string>
<token-text xml:space="preserve"/>
</arg-string>
</do-set-local-variable>
<do-for-each>
<arg-node-set>
<token-local-variable name="varRoleCatogeryKey"/>
</arg-node-set>
<arg-actions>
<do-set-local-variable name="varMultipleRoleCatKeys" scope="policy">
<arg-string>
<token-local-variable name="varMultipleRoleCatKeys"/>
<token-text xml:space="preserve">,</token-text>
<token-local-variable name="current-node"/>
</arg-string>
</do-set-local-variable>
</arg-actions>
</do-for-each>
=======================================================================================
Part of Trace:

[05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST: Action: do-set-local-variable("varMultipleRoleCatKeys",scope="policy",token-local-variable("varMultipleRoleCatKeys") "," token-local-variable("current-node")).
[05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST: arg-string(token-local-variable("varMultipleRoleCatKeys") "," token-local-variable("current-node"))
[05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST: token-local-variable("varMultipleRoleCatKeys")
[05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST: Token Value: "".
[05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST: token-text(",")
[05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST: token-local-variable("current-node")
[05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST: Token Value: "AlphaBetaDelta".
[05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST: Arg Value: ",AlphaBetaDelta".
==============================================

current Node is returning value as "AlphaBetaDelta" .

Some one help me on this how to achieve these values as Alpha,Beta,Delta.



Regards,
Eswar
  • You are dealing with a nodeset, so I would use a foreach to iterate over
    the values, appending to the local variable each iteration, thus creating
    the resulting val0,val1,val2 string that you want. Otherwise, I think
    what you are trying to do, treating the elements of the nodeset as
    individual strings in this context, is invalid.


    --
    Good luck.

    If you find this post helpful and are logged into the web interface,
    show your appreciation and click on the star below.

    If you want to send me a private message, please let me know in the
    forum as I do not use the web interface often.
  • On 01.06.2017 13:34, ed00491298 wrote:
    >
    > Hello All,
    >
    > I am using Loop Back driver to send email notification to users when the
    > roles assigned to them are about to expire. In the email I need to
    > Publish Role CN, Expiry date and nrfRoleCategorykey (multi-valued
    > attribute in the role). For each role I am fetching nrfRoleCategorykey
    > value using query, as it is multi-valued attribute it is giving all the
    > values as a single concatenated string without any delimiter example as
    > below:
    > nrfroleCategoryKey: AlphaBetaDelta��. etc.
    > I want these values with some delimiter as (Alpha, Beta, Delta,...etc).


    use the join action for that:

    <do-set-local-variable name="list" scope="policy">
    <arg-string>
    <token-join delimiter=",">
    <token-local-variable name="varRoleCatogeryKey"/>
    </token-join>
    </arg-string>
    </do-set-local-variable>

    --
    Norbert
  • Thank you for the reply,

    Even i tried with for each loop, if you look into the trace i posted the current node is returning the value as concatenated string. i.e, The result value of query is returning as concatenated string like "alphaBetaDelta"(in both the case - set as node-set or string).
  • ed00491298 wrote:

    >
    > Thank you for the reply,
    >
    > Even i tried with for each loop, if you look into the trace i posted the
    > current node is returning the value as concatenated string. i.e, The
    > result value of query is returning as concatenated string like
    > "alphaBetaDelta"(in both the case - set as node-set or string).


    Try:

    <do-set-local-variable name="varRoleCatogeryKey" scope="policy">
    <arg-node-set>
    <token-query class-name="nrfRole" datastore="src">
    <arg-dn>
    <token-global-variable name="RolesContainer"/>
    </arg-dn>
    <arg-match-attr name="CN">
    <arg-value type="string">
    <token-local-variable name="RoleName"/>
    </arg-value>
    </arg-match-attr>
    <arg-string>
    <token-text xml:space="preserve">nrfRoleCategoryKey</token-text>
    </arg-string>
    </token-query>
    </arg-node-set>
    </do-set-local-variable>

    <do-set-local-variable name="varMultipleRoleCatKeys" scope="policy">
    <arg-node-set>
    <token-text xml:space="preserve"/>
    </arg-node-set>
    </do-set-local-variable>

    <do-for-each>
    <arg-node-set>
    <token-xpath
    expression="$varRoleCatogeryKey//value[ancestor::*[@attr-name='nrfRoleCategoryKe
    y']]"/>
    </arg-node-set>
    <arg-actions>
    <do-set-local-variable name="varMultipleRoleCatKeys" scope="policy">
    <arg-node-set>
    <token-xpath expression="$varMultipleRoleCatKeys | $current-node"/>
    </arg-node-set>
    </do-set-local-variable>
    </arg-actions>
    </do-for-each>

    <do-set-local-variable name="varMultipleRoleCatKeys" scope="policy">
    <arg-string>
    <token-join delimiter=",">
    <token-local-variable name="varMultipleRoleCatKeys"/>
    </token-join>
    </arg-string>
    </do-set-local-variable>
  • ed00491298 wrote:

    >
    > Thank you for the reply,
    >
    > Even i tried with for each loop, if you look into the trace i posted the
    > current node is returning the value as concatenated string. i.e, The
    > result value of query is returning as concatenated string like
    > "alphaBetaDelta"(in both the case - set as node-set or string).


    Try:

    <do-set-local-variable name="varRoleCatogeryKey" scope="policy">
    <arg-node-set>
    <token-query class-name="nrfRole" datastore="src">
    <arg-dn>
    <token-global-variable name="RolesContainer"/>
    </arg-dn>
    <arg-match-attr name="CN">
    <arg-value type="string">
    <token-local-variable name="RoleName"/>
    </arg-value>
    </arg-match-attr>
    <arg-string>
    <token-text xml:space="preserve">nrfRoleCategoryKey</token-text>
    </arg-string>
    </token-query>
    </arg-node-set>
    </do-set-local-variable>

    <do-set-local-variable name="varMultipleRoleCatKeys" scope="policy">
    <arg-node-set>
    <token-text xml:space="preserve"/>
    </arg-node-set>
    </do-set-local-variable>

    <do-for-each>
    <arg-node-set>
    <token-xpath
    expression="$varRoleCatogeryKey//value[ancestor::*[@attr-name='nrfRoleCategoryKe
    y']]"/>
    </arg-node-set>
    <arg-actions>
    <do-set-local-variable name="varMultipleRoleCatKeys" scope="policy">
    <arg-node-set>
    <token-xpath expression="$varMultipleRoleCatKeys | $current-node"/>
    </arg-node-set>
    </do-set-local-variable>
    </arg-actions>
    </do-for-each>

    <do-set-local-variable name="varMultipleRoleCatKeys" scope="policy">
    <arg-string>
    <token-join delimiter=",">
    <token-local-variable name="varMultipleRoleCatKeys"/>
    </token-join>
    </arg-string>
    </do-set-local-variable>
  • On 6/2/2017 6:55 AM, Alex McHugh wrote:
    > <do-set-local-variable name="varMultipleRoleCatKeys" scope="policy">
    > <arg-node-set>
    > <token-xpath expression="$varMultipleRoleCatKeys | $current-node"/>
    > </arg-node-set>
    > </do-set-local-variable>


    Alex,

    In this snippet, what does the XPATH accomplish?

    <token-xpath expression="$varMultipleRoleCatKeys | $current-node"/>


  • On 6/1/2017 7:34 AM, ed00491298 wrote:
    >
    > Hello All,
    >
    > I am using Loop Back driver to send email notification to users when the
    > roles assigned to them are about to expire. In the email I need to
    > Publish Role CN, Expiry date and nrfRoleCategorykey (multi-valued
    > attribute in the role). For each role I am fetching nrfRoleCategorykey
    > value using query, as it is multi-valued attribute it is giving all the
    > values as a single concatenated string without any delimiter example as
    > below:
    > nrfroleCategoryKey: AlphaBetaDelta��. etc.
    > I want these values with some delimiter as (Alpha, Beta, Delta,...etc).
    >
    > BELOW IS THE CODE I AM USING:
    >
    > <do-set-local-variable name="varRoleCatogeryKey" scope="policy">
    > <arg-node-set>
    > <token-query class-name="nrfRole" datastore="src">
    > <arg-dn>
    > <token-global-variable name="RolesContainer"/>
    > </arg-dn>
    > <arg-match-attr name="CN">
    > <arg-value type="string">
    > <token-local-variable name="RoleName"/>
    > </arg-value>
    > </arg-match-attr>
    > <arg-string>
    > <token-text
    > xml:space="preserve">nrfRoleCategoryKey</token-text>
    > </arg-string>
    > </token-query>
    > </arg-node-set>
    > </do-set-local-variable>
    > <do-set-local-variable name="varMultipleRoleCatKeys"
    > scope="policy">
    > <arg-string>
    > <token-text xml:space="preserve"/>
    > </arg-string>
    > </do-set-local-variable>
    > <do-for-each>
    > <arg-node-set>
    > <token-local-variable name="varRoleCatogeryKey"/>
    > </arg-node-set>
    > <arg-actions>
    > <do-set-local-variable name="varMultipleRoleCatKeys"
    > scope="policy">
    > <arg-string>
    > <token-local-variable name="varMultipleRoleCatKeys"/>
    > <token-text xml:space="preserve">,</token-text>
    > <token-local-variable name="current-node"/>
    > </arg-string>
    > </do-set-local-variable>
    > </arg-actions>
    > </do-for-each>
    > =======================================================================================
    > PART OF TRACE:
    >
    > [05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST:
    > Action:
    > do-set-local-variable("varMultipleRoleCatKeys",scope="policy",token-local-variable("varMultipleRoleCatKeys") "," token-local-variable("current-node")).
    > [05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST:
    >
    > arg-string(token-local-variable("varMultipleRoleCatKeys") "," token-local-variable("current-node"))
    > [05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST:
    > token-local-variable("varMultipleRoleCatKeys")
    > [05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST:
    > Token Value: "".
    > [05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST:
    > token-text(",")
    > [05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST:
    > token-local-variable("current-node")
    > [05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST:
    > Token Value: "AlphaBetaDelta".
    > [05/31/17 11:35:23.732]:Loopback Driver Roles Exp Notification ST:
    > Arg Value: ",AlphaBetaDelta".
    > ==============================================
    >
    > current Node is returning value as "AlphaBetaDelta" .
    >
    > Some one help me on this how to achieve these values as
    > Alpha,Beta,Delta.


    You are treating a nodeset as a string. in which case, the text()
    elements are concatted together as you see.

    Use the Join token on the Nodeset variable to make string of all the
    values.

    If you need something more complex, then loop over the nodeset and do
    what you need inside the loop.

    An XDS nodeset from a Query token, would look like:

    <instance src-dn="\T\o\ou\cn">
    <attr attr-name="attributeName">
    <value>SomeText</value>
    </attr>
    </instance>

    (Typed freehand as an example)

    So the SomeText is the only text() element in that nodeset example.

    If your nodeset had 2 attributes, you would get all the values
    concatted. So be careful what you ask for.


  • Geoffrey Carman wrote:

    > You are treating a nodeset as a string. in which case, the text() elements
    > are concatted together as you see.


    To add a little to the confusion, here's what the xpath 1.0 RFC has to say
    about nodeset to string conversion:

    "A node-set is converted to a string by returning the string-value of the node
    in the node-set that is first in document order."

    "The string-value of an element node is the concatenation of the string-values
    of all text node descendants of the element node in document order."

    " The string-value of a text node is the character data"

    -> https://www.w3.org/TR/xpath/

    varRoleCatogeryKey is set by token-query so it contains a single instance node,
    which results in a string value as shown in the trace. If the nrfRole object
    was associated, the association value would also been part of the string value,
    further messing things up.

    He should've looped over xpath($varRoleCatogeryKey//value) instead to achieve
    what he was trying to do. Better use token-join as already suggested in this
    use case, though.

    --
    http://www.is4it.de/en/solution/identity-access-management/

    (If you find this post helpful, please click on the star below.)
  • Geoffrey Carman <geoffreycarmanNOSPAM@NOSPAMgmail.com> wrote:
    > On 6/2/2017 6:55 AM, Alex McHugh wrote:
    >> <do-set-local-variable name="varMultipleRoleCatKeys" scope="policy">
    >> <arg-node-set>
    >> <token-xpath expression="$varMultipleRoleCatKeys | $current-node"/>
    >> </arg-node-set>
    >> </do-set-local-variable>

    >
    > Alex,
    >
    > In this snippet, what does the XPATH accomplish?
    >
    > <token-xpath expression="$varMultipleRoleCatKeys | $current-node"/>
    >


    I prefer that to set local variable X = local variable X newValue.
    Calculating union makes more sense.

  • On 6/5/2017 4:28 PM, Alex McHugh wrote:
    > Geoffrey Carman <geoffreycarmanNOSPAM@NOSPAMgmail.com> wrote:
    >> On 6/2/2017 6:55 AM, Alex McHugh wrote:
    >>> <do-set-local-variable name="varMultipleRoleCatKeys" scope="policy">
    >>> <arg-node-set>
    >>> <token-xpath expression="$varMultipleRoleCatKeys | $current-node"/>
    >>> </arg-node-set>
    >>> </do-set-local-variable>

    >>
    >> Alex,
    >>
    >> In this snippet, what does the XPATH accomplish?
    >>
    >> <token-xpath expression="$varMultipleRoleCatKeys | $current-node"/>
    >>

    >
    > I prefer that to set local variable X = local variable X newValue.
    > Calculating union makes more sense.


    Cool, I never tried that. What happens if the values are duplicated?
    Do you get a second instance in the resulting nodeste?