3

如何使用 XPATH 的匹配功能在 XML 标记中搜索整个单词?

以下代码返回“未知方法匹配”:

XML_Doc:=CreateOleObject('Msxml2.DOMDocument.6.0') as IXMLDOMDocument3;
XML_DOC.selectNodes('/DATI/DATO[matches(TEST_TAG,"\bTest\b")]');

示例 XML 文件

<DATI>
 <DATO>
   <TEST_TAG>Test</TEST_TAG>
 </DATO>
 <DATO>
   <TEST_TAG>Test21</TEST_TAG>
 </DATO>
 <DATO>
   <TEST_TAG>Abc</TEST_TAG>
 </DATO>
</DATI>
4

2 回答 2

4

matches是 XPath 2,Msxml 只支持 XPath 1。
据我所知,Delphi 没有支持 XPath 2 的库。(虽然我为 Freepascal 写了一个 XPath 2 库,但移植应该没有那么难)

你可以使用

/DATI/DATO[not(contains(TEST_TAG," "))]

查找不包含空格的单词,即 XPath 1。

于 2012-09-17T08:35:42.273 回答
0

假设您所说的“单词”是指

以拉丁字母开头,包含的所有字符都是拉丁字母或十进制数字

可以使用 XPath 表达式准确地找到这些:

  //TEST_TAG
    [contains('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
              substring(.,1,1)
              )
   and
     not(
     translate(.,
               'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
               '')
         )
    ]

基于 XSLT 的验证

<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="/*">
     <xsl:copy-of select=
     "//TEST_TAG
        [contains('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
                  substring(.,1,1)
                  )
       and
         not(
         translate(.,
                   'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
                   '')
             )
        ]
   "/>
 </xsl:template>
</xsl:stylesheet>

当应用于此 XML 文档(提供的文档,但添加了非法“单词”)时:

<DATI>
    <DATO>
        <TEST_TAG>Test</TEST_TAG>
    </DATO>
    <DATO>
        <TEST_TAG>#$%Test21</TEST_TAG>
    </DATO>
    <DATO>
        <TEST_TAG>Abc</TEST_TAG>
    </DATO>
</DATI>

计算上述 XPath 表达式并将所选元素复制到输出:

<TEST_TAG>Test</TEST_TAG>
<TEST_TAG>Abc</TEST_TAG>

请注意

当前接受的答案错误地产生了这个:

<TEST_TAG>#$%Test21</TEST_TAG>

作为字符串值为“单词”的元素。

于 2012-09-17T12:35:01.610 回答