如何使用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>
答案 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”的元素。