XPATH中的正则表达式

时间:2012-09-17 08:21:17

标签: delphi xpath

如何使用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>

2 个答案:

答案 0 :(得分:4)

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

您可以使用

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

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

答案 1 :(得分:0)

假设用“word”表示

  

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

可以使用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文档(提供的文档,但添加了非法的“word”):

<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>

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