2014-02-06 55 views
2

我正在使用xmlstarletliquibase XML更改日誌中提取changeSet節點,其中viewName以「v」結尾。爲什麼xmlstarlet說沒有'ends-with'函數?

然而,xmlstarlet被抱怨ends-with XPATH功能不存在:

$ xmlstarlet sel -N x="http://www.liquibase.org/xml/ns/dbchangelog" -t -m \ 
"/x:databaseChangeLog/x:changeSet[x:createView[ends-with(@viewName, 'v')]]" \ 
-c . public.db.changelog.xml 

xmlXPathCompOpEval: function ends-with not found 
Unregistered function 
Stack usage errror 
xmlXPathCompiledEval: 3 objects left on the stack. 
runtime error: element for-each 
Failed to evaluate the 'select' expression. 
None of the XPaths matched; to match a node in the default namespace 
use '_' as the prefix (see section 5.1 in the manual). 
For instance, use /_:node instead of /node 

的XML看起來有點像這樣:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> 
    <changeSet id="1391529990457-3"> 
    <createView viewName="myviewnamev"><!-- view definition here --></createView> 
    </changeSet> 
    <changeSet id="1391529990457-4"> 
    <createView viewName="anotherviewname"><!-- view definition here --></createView> 
    </changeSet> 
</databaseChangeLog> 

我知道的XPath表達式,否則正確,因爲如果我將選擇標準更改爲x:createView[@viewName="myviewnamev"],那麼它只能正確選擇changeLog條目。

如何讓xmlstarlet正確使用ends-with?或者,有沒有其他方法可以完成我想要做的事情?

+0

你在哪裏可以看到[XPath規範](http://www.w3.org/TR/xpath/)中的'ends-with'函數? –

+0

@ O.R.Mapper right [here](http://www.w3.org/TR/xquery-operators/#func-ends-with)但Jens的答案已經闡明,xmlstarlet不支持XPath 2.0。 – Jonathan

+0

確實如此。 –

回答

3

xmlstarlet只支持XPath 1.0,它不提供ends-with($string, $token)函數。您需要使用substringstring-length和和字符串比較使用這種模式來構建你自己:

substring($string, string-length($string) - string-length($token) + 1) = $token] 

適用於您的查詢,它應該是這樣的(我「預計算」的字符串長度):

/x:databaseChangeLog/x:changeSet[x:createView[ 
    substring(@viewName, string-length(@viewName)) = 'v'] 
] 

或者,您可能需要尋找更強大的XPath 2.0/XQuery引擎。

+0

謝謝!既然這是一次性的,這個解決方案將會很棒。 – Jonathan

相關問題