2012-05-03 50 views
2

我正在尋找一個XPATH表達式來執行搜索,以確保字段中沒有字母。例如輸入XML:XPATH用字母過濾掉記錄

<?xml version="1.0" encoding="UTF-8"?> 
<payload> 
    <records> 
     <record> 
      <number>123</number> 
     </record> 
     <record> 
      <number>456</number> 
     </record> 
     <record> 
      <number>78A</number> 
     </record> 
    </records> 
</payload> 

我希望它也過濾出第三個結果,因爲它在標記中有一個字母。因此,返回此:

<?xml version="1.0" encoding="UTF-8"?> 
<payload> 
    <records> 
     <record> 
      <number>123</number> 
     </record> 
     <record> 
      <number>456</number> 
     </record> 
    </records> 
</payload> 

這有可能在一個簡單的XPath嗎?

因此,像/payload/records/record[reg expression here?]

@Cylian

這就是我的意思是:

<?xml version="1.0" encoding="UTF-8"?> 
<payload> 
    <records> 
     <record> 
      <number>123</number> 
      <time>12pm</time> 
      <zome>UK</zome> 
     </record> 
     <record> 
      <number>456</number> 
      <time>12pm</time> 
      <zome>UK</zome> 
     </record> 
     <record> 
      <number>78A</number> 
      <time>12pm</time> 
      <zome>UK</zome> 
     </record> 
    </records> 
</payload> 

回答

3

XPath(1.0和2.0)是XML文檔的查詢語言。

正如這樣XPath表達式僅選擇節點集(或提取其他數據),但不能更改XML文檔的結構(如刪除節點)。

因此,構建將所提供的XML文檔更改爲想要的XML文檔的XPath表達式是不可能的。

這個任務可以很容易地使用XSLT或XQuery(不是那麼容易)來完成:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="record[translate(number, '', '')]"/> 
</xsl:stylesheet> 

當這種變換所提供的XML文檔應用:

<payload> 
    <records> 
     <record> 
      <number>123</number> 
     </record> 
     <record> 
      <number>456</number> 
     </record> 
     <record> 
      <number>78A</number> 
     </record> 
    </records> 
</payload> 

通緝,會產生正確的結果:

<payload> 
    <records> 
     <record> 
     <number>123</number> 
     </record> 
     <record> 
     <number>456</number> 
     </record> 
    </records> 
</payload> 
+0

有沒有做相反的方法,以便任何字段包含任何東西,但一個數字,所以單個字母,大寫和特殊字符?那有意義嗎? – MMKD

+0

是的,有。在一個新問題中提出這個問題會很好。 –

0

試試這個(XPath 2.0中):

/payload/records/record[matches(child::*/text(),'[^\p{L}]')] 
+0

快速的問題,因爲我是新來的XPath,這如何知道在數量標籤看起來特別?如果說我有兩個標籤坐在一起,'

1

可以使用一個XQuery表達式更新容易刪除的節點,太:

for $record in doc('payload.xml')//record 
where xs:string(number($record/number)) = 'NaN' 
return delete node $record