使用Xpath包含

时间:2014-12-23 09:05:10

标签: javascript xpath xquery xpath-2.0 xpathnavigator

我试图通过使用contains来找到元素。问题是如果字符串包含一个单引号或双引号,则很难得到它。 我正在使用这个xpath直接匹配第一个元素。有没有更好的方法来实现而不使用'和'语句?

使用的Xpath: -

.//*[local-name()='GEOGRAPHY_TITLE'][contains(.,"APAC > Andaman Islands > test&'<,")and contains(., '"123')]

使用的XML: -

<MST>
<MST_GEOGRAPHY >
               <GEOGRAPHY_TITLE>APAC &gt; Andaman Islands &gt; test&amp;'&lt;,\"123</GEOGRAPHY_TITLE>
               <GEOGRAPHY_ID>5a7a24ec-93ff-8be6-7ef9-fa021500df0e</GEOGRAPHY_ID>
               <TENANT_ID>{0559cdcb-c63b-4c81-be91-b78e831bf5a5}</TENANT_ID>
               <ACTIVE>1</ACTIVE>
</MST_GEOGRAPHY>
<MST_GEOGRAPHY >
               <GEOGRAPHY_TITLE>APAC &gt; Andaman Islands &gt; test\"123&amp;'&lt;,\"123</GEOGRAPHY_TITLE>
               <GEOGRAPHY_ID>5a7a24ec-93ff-8be6-7ef9-fa021500df0e</GEOGRAPHY_ID>
               <TENANT_ID>{0559cdcb-c63b-4c81-be91-b78e831bf5a5}</TENANT_ID>
               <ACTIVE>1</ACTIVE>
</MST_GEOGRAPHY>
<MST_GEOGRAPHY >
               <GEOGRAPHY_TITLE>hi</GEOGRAPHY_TITLE>
               <GEOGRAPHY_ID>5a7a24ec-93ff-8be6-7ef9-fa021500df0e</GEOGRAPHY_ID>
               <TENANT_ID>{0559cdcb-c63b-4c81-be91-b78e831bf5a5}</TENANT_ID>
               <ACTIVE>1</ACTIVE>
</MST_GEOGRAPHY>
</MST>

2 个答案:

答案 0 :(得分:1)

可以在不使用contains() 的情况下选择所需元素,但只需进行严格比较 - 如下所示:

//*/text()[1][. = concat("APAC > Andaman Islands > test&'<,\", '"123')]

解释

请注意使用标准XPath函数concat(),以便可以使用引号或撇号来包围不包含它们的字符串部分 - 并连接字符串的这些部分进入完整的字符串。

注意:此解决方案仅使用纯XPath 1.0。

答案 1 :(得分:0)

这可能是一种风格,但我可能会将你的XPath重写为:

//*:GEOGRAPHY_TITLE[contains(., "APAC > Andaman Islands > test&'<,")][contains(., '"123')]

以这种方式选择元素是绝对的和静态的,而不是local-name函数的评估,这应该证明更有效。由于您已经熟悉使用多个谓词作为 AND'ing 约束的一种方式,因此对于包含而不是'and'关键字使用多个谓词似乎也是明智的。通常(但不总是)如果您首先放置最具选择性的谓词,您将看到比首先放置最少选择性谓词更好的性能。