PavelPraulov
PavelPraulov

Reputation: 629

How I can add String constant to xpath expression

please help me in this problem.

I have this xml:

<?xml version="1.0" encoding="UTF-8"?>
<queries>
        <query>
            <name>LOAD_ALL_DATA</name>
            <text>[some query]</text>
            <key_fields>
                <field>
                    <name>login</name>
                    <db_table_name>TABLE1_VIE</db_table_name>
                    <db_field_name>LOGIN</db_field_name>
                    <owner>User</owner>
                </field>
                <field>
                    <name>pass</name>
                    <db_table_name>TABLE1_VIE</db_table_name>
                    <db_field_name>PASS</db_field_name>
                    <owner>User</owner>
                </field>  
            </key_fields>
        </query>
    </queries>

and this xpath expression, that returned some valuable values:

//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/name|
//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/db_table_name |
//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/db_field_name |
//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/owner

for example, this expression returns this array:

login
TABLE1_VIE
LOGIN
User
pass
TABLE1_VIE
PASS
User

Now i want to add name of node, that contain value, as in next example:

login/name
TABLE1_VIE/db_table_name
LOGIN/db_field_name
User/owner
pass/name
TABLE1_VIE/db_table_name
PASS/db_field_name
User/owner

I tried to use function name(), but it doesn't work for me.

Upvotes: 1

Views: 4311

Answers (2)

PavelPraulov
PavelPraulov

Reputation: 629

Finally I've modified StuartLC's answer, and now it looks like so:

//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/name/concat(local-name(), ':', 

text()) ||'
'||
//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/db_table_name/concat(local-name(), ':', text()) ||'
'||
//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/db_field_name/concat(local-name(), ':', text()) || '
'||
//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/owner/concat(local-name(), ':', text()) 

and it works for me.

Upvotes: 1

StuartLC
StuartLC

Reputation: 107237

As you've guessed, name() (with namespace), or local-name() (without) will give you the name of the current node. In XPath 2 you can do like so:

//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/name/concat(text(), 
    '/', local-name()) 
| ...

In XPath 1, you'll need the rather more verbose:

concat(//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/name/text(), 
      '/', 
      local-name(//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/name)) 
| ...

Upvotes: 0

Related Questions