【问题标题】:XPath translate() within contains() with dynamic variablecontains() 中的 XPath translate() 与动态变量
【发布时间】:2016-04-05 11:36:26
【问题描述】:

我正在 VBscript 中使用具有 XPath 以返回匹配节点信息的应用程序。

为了使它不区分大小写,我使用了翻译功能。有一个变量保存要搜索的值(比如 v_Search)。在我实现 translate() 之后,它不会返回匹配的节点,而是返回 XML 中的所有节点。

XPath 下方返回正确信息,但区分大小写;-

//*[contains(., '"& v_search &"')]/ancestor-or-self::*/*[local-name()='name' and @locale='en']

为了不区分大小写,我实现了translate(),但它无法检查匹配结果。下面是表达式:-

//*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') , v_search)]/ancestor-or-self::*/*[local-name()='name' and @locale='en']

我无法弄清楚出了什么问题..

  1. 此表达式返回 xml 文档中的所有内容。

  2. 我已经尝试过'"& v_search &"',在这种情况下它没有给出任何结果。

编辑找出问题后

//*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), translate('"& v_search &"', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]/ancestor-or-self::*/*[local-name()='name' and @locale='en']

它仍然不只返回匹配的节点。但是它现在不返回整个 xml 节点。

编辑:- 示例 Xml

<root xmlns="https://jlkjsdlfjl/">
    <name>Accounts</name>
    <property name="included" type="hidden">true</property>
    <locales>
        <locale>en</locale>
        <locale>de</locale>
    </locales>
    <defaultLocale>en</defaultLocale>
    <searchspace>
        <name locale="en">Accounts</name>
        <name locale="de">Accounts</name>
        <lastChanged>2014-03-05T18:47:30</lastChanged>
        <lastChangedBy>userx</lastChangedBy>
        <property name="included" type="hidden">true</property>
        <searchspace>
            <name locale="en">Database L</name>
            <name locale="zw">Database L</name>
            <searchSubject status="valid">
                <name locale="en">SName1</name>
                <name locale="zw">qskxyz</name>
                <searchItem>
                    <name locale="en">IName1</name>
                    <name locale="zw">qixyz</name>
                    <hello>v_search</hello>
                </searchItem>
                 <searchItem>
                    <name locale="en">IName2</name>
                    <name locale="zw">abc</name>
                    v_search
                </searchItem>
                 <searchItem>
                    <name locale="en">IName3</name>
                    <name locale="zw">def</name>
                    <hello>something else</hello>
                </searchItem>
            </searchSubject>
        </searchspace>
    </searchspace>
    <searchspace>
        <name locale="en">Names</name>
        <lastChanged>2016-01-12T12:42:46</lastChanged>
        <searchspace>
            <name locale="en">Database Layer</name>
            <name locale="zw">Database Layer</name>
            <searchSubject status="valid">
                <name locale="en">SName2</name>
                <searchItem>
                    <name locale="en">IName4</name>
                    <hello>...Hi there..</hello>
                </searchItem>
            </searchSubject>
        </searchspace>
    </searchspace>
</root>

示例结果:

帐户、数据库 L、SName1、IName 1

--------, ----------, --------, IName 2

这两个层次结构包含v_search文本....其他人不应该来。

【问题讨论】:

  • 添加翻译后,我不明白您为什么在“祖先或自我”之前执行“//”。这将使您所有的孩子都遵守一个条件以及每个孩子的祖先。
  • 这是一个错误......仍然有问题......我正在编辑问题。
  • 在您的 xml 中没有主节点,但 xpath 正在过滤器中寻找它们。 (local-name()='home')
  • 抱歉,我刚刚将“home”节点替换为“name”
  • 你在这个线程的过程中做了这么多的小修正,最好从一个新问题重新开始。使问题可重现,因此任何人都可以获取您的代码和数据,看看他们是否得到相同的结果。

标签: xml xpath


【解决方案1】:
//*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), translate('v_search', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]/ancestor-or-self::*/name[@locale='en']

我在 xpathtester 中测试过,结果是:

<name locale="en">Accounts</name>
<name locale="en">Database L</name>
<name locale="en">SName1</name>
<name locale="en">IName1</name>
<name locale="en">IName2</name>

【讨论】:

  • 谢谢@derloopkat,这与我的问题相同,但我在测试时遗漏了它。
【解决方案2】:

contains(.... , v_search) 确实是错误的。该表达式将第一个参数与子元素 v_search 的值进行比较。如果在当前上下文元素中未找到 v_search 元素,或者找到该元素但包含空字符串,则它始终返回 true。

由于您要将contains() 的第一个参数转换为小写,因此您需要确保v_search 变量也包含小写字符串。

【讨论】:

  • 我在修改后进行了编辑,结果仍然不正确但是它现在不返回整个 xml 节点请建议......
  • 目前还不清楚问题出在哪里,无法查看您的 XML 并将其与您的 XPath 进行比较。
  • 如果您可以发布一个示例关键字来替换变量v_search 和一个非常简化的 XML,足以说明应该选择什么以及在其中选择什么,那么提供帮助会容易得多。
  • 顺便说一句,您可以在 XPath 测试器中针对 XML 独立于 VBA 测试您的 XPath,例如 xpathtester.com/xpath(或任何其他 xpath 测试器)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
相关资源
最近更新 更多