我正在寻找一个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>
答案 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}]')]