请帮我解决这个问题。
我有这个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>
和这个xpath表达式,它返回了一些有价值的值:
//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
例如,此表达式返回此数组:
login
TABLE1_VIE
LOGIN
User
pass
TABLE1_VIE
PASS
User
现在我想添加包含值的节点名称,如下例所示:
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
我尝试使用函数名称(),但它对我没用。
答案 0 :(得分:1)
最后我修改了StuartLC的答案,现在看来是这样的:
//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())
它适用于我。
答案 1 :(得分:0)
正如您所猜测的那样,name()
(带有命名空间)或local-name()
(不带)将为您提供当前节点的名称。在XPath 2中你可以这样做:
//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/name/concat(text(),
'/', local-name())
| ...
在XPath 1中,您需要更详细的内容:
concat(//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/name/text(),
'/',
local-name(//queries/query[name = 'LOAD_ALL_DATA']/key_fields/field/name))
| ...