2

我正在寻找一个 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>
4

3 回答 3

3

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

因此,XPath 表达式仅选择节点集(或提取其他数据),但不能改变 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, '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>
于 2012-05-03T13:01:45.857 回答
1

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

for $record in doc('payload.xml')//record
where xs:string(number($record/number)) = 'NaN'
return delete node $record
于 2012-05-03T13:41:21.513 回答
0

试试这个(XPath 2.0):

/payload/records/record[matches(child::*/text(),'[^\p{L}]')]
于 2012-05-03T12:33:24.487 回答