XPATH过滤掉带字母的记录

时间:2012-05-03 12:19:22

标签: xml xslt xpath

我正在寻找一个XPATH表达式,它将执行搜索以确保字段中没有字母。例如输入XML:

<?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 个答案:

答案 0 :(得分:3)

XPath(1.0和2.0)是XML文档的查询语言。

因此 XPath表达式只选择节点集(或提取其他数据),但不能改变XML文档的结构(如删除节点)

因此,无法构造一个XPath表达式来将提供的XML文档更改为所需的XML文档。

使用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, '0123456789', '')]"/>
</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>

答案 1 :(得分:1)

您也可以使用XQuery Update表达式轻松删除节点:

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

答案 2 :(得分:0)

试试这个(XPath 2.0):

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