我如何将String常量添加到xpath表达式

时间:2014-04-02 04:46:59

标签: xml xpath

请帮我解决这个问题。

我有这个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

我尝试使用函数名称(),但它对我没用。

2 个答案:

答案 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)) 
| ...