Reputation: 629
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
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
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