2014-04-02 49 views
1

請幫我解決這個問題。如何將字符串常量添加到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 

我試過使用函數name(),但它不適用於我。

回答

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)) 
| ... 
+0

Thaks很多,快速回復,但 – PavelPraulov

+0

你的建議不使用的情況下使用工會的運營商合作「|」例如.Expression:'//查詢/查詢[名稱=「LOAD_ALL_DATA」]/key_fields/field/name/concat(text(),'/',local-name())| (),'/',local-name())'return **錯誤:錯誤:XPTY0004:無效的節點**或者我沒有正確使用你的建議? – PavelPraulov

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()) 

它適用於我。

相關問題