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
Parents
  • 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.
Reply
  • 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.
Children
  • 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"/>


  • 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?


  • Geoffrey Carman <geoffreycarmanNOSPAM@NOSPAMgmail.com> wrote:
    >
    > Cool, I never tried that. What happens if the values are duplicated?
    > Do you get a second instance in the resulting nodeste?
    >
    >


    Generally, yes you get a duplicate.
    Follows the same logic as any other XPath union in that regard.

    Can use ecmascript to make unique values.
  • Hi Alex,

    Thank you so much for the Help, It worked :):)