如何获取一个具有 xpath 的节点,该节点在 text 属性中只有数字?

How to get a node with Xpath which has only digits in the text attribute?

提问人:Gauthier Buttez 提问时间:10/15/2023 更新时间:10/16/2023 访问量:27

问:

我有这样的 DOM:

<a>abc</a>
<a>def</a>
<a>13456</a>
<a>gh564</a>

我想得到只包含数字的元素。

我可以通过获取所有元素并循环它们来检查 text() 是否为数字来做到这一点,但我更喜欢直接使用 Xpath 找到它。可能吗?

XPath XPath-2.0

评论


答:

0赞 Martin Honnen 10/15/2023 #1

使用 ,但这也适用于浮点内容,所以也许.或者旧的 XPath 1,测试:.//a[number() = number()]<a>3.14</a>//a[matches(., '^[0-9]+$')]translate//a[not(translate(., '0123456789', ''))]

0赞 Michael Kay 10/15/2023 #2

在 XPath 2.0 中,您可以将 matches() 函数与正则表达式一起使用。

1赞 Dimitre Novatchev 10/16/2023 #3

除了使用该函数的解决方案外,还有两种解决方案matches()

//*[. castable as xs:integer]

//*[normalize-space() and not(translate(., '0123456789', ''))])

第二种解决方案可以在纯 XPath 1 - (仅)支持平台上使用。


基于 XSLT 的验证

此转换:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    <xsl:sequence select=
      "(//*[. castable as xs:integer],
        //*[normalize-space() and not(translate(., '0123456789', ''))])"/>

  </xsl:template>
</xsl:stylesheet>

当应用于此 XML 文档时

<t>
    <a>abc</a>
    <a>def</a>
    <a>13456</a>
    <a>gh564</a>
</t>

计算两个 XPath 表达式,并将这些计算的结果复制到输出中:

<a>13456</a>
<a>13456</a>