【问题标题】:How to use the XPath contains() function within document.evaluate()?如何在 document.evaluate() 中使用 XPath contains() 函数?
【发布时间】:2012-01-23 09:46:38
【问题描述】:

我有这段代码,我一直在使用它来根据搜索的名称过滤掉字段。问题是我需要它对用户可以输入的内容有点宽容。所以我必须使用contains 函数。我已经让它在其他代码 sn-ps 上工作,但我不确定如何将它与以下代码一起使用:

var value = stylesheet.evaluate(
                               "//xsl:for-each[@select='book[author="contains(.,'containsSearchTerm')"']",
                               stylesheet, nsResolver,
                               XPathResult.ANY_UNORDERED_NODE_TYPE, null);

对不起,如果引号/转义有点混乱。我没有打开 IDE 来检查我的错误,我正在准备工作。

所以可能能够看到 containsSearchTerm 是我想要获取表单的值并使用contains 函数处理它。这是如何实现的?

请注意,总的来说,我对 XML、XSLT 和 XPath 还很陌生,所以如果可能的话,我需要稍微简化一下。


回复迈克尔·凯 -

您好,我正在尝试将搜索到的术语/单词应用于 XSLT 表中的作者字段。 是的,你是对的,这就是我想要做的。编辑样式表并在输入表单中应用条件集。 到目前为止,我一直在使用预构建的功能。根据需要进行修改。 如果对要搜索的输入值进行硬编码,我可以使包含在外部工作。但是,我想按原样“即时​​”执行此操作,并且我真的不确定如何在我所追求的环境中使其工作。 我实际上拥有的是在表单中构建的查询 - 指定要搜索的字段、操作数和搜索词。但我不想搜索整个字符串,因为这有点不灵活 - 所以我想使用 contains 函数来允许搜索灵活性。

感谢您的帮助

【问题讨论】:

  • @mzjn,看来,OP 正在尝试查看 XSL 样式表
  • 如何在我想写的地方写一个 contains 函数来对我输入的词进行部分搜索...?
  • @_lionysis:即使这还不清楚,但如果您编辑您的问题,仍然会有所改进。另外,解释一下“部分搜索”是什么意思。要了解有关 contains() 函数的更多信息,请在此处阅读 W3C 规范:w3.org/TR/1999/REC-xpath-19991116/#function-contains。那里有一些很好的例子。

标签: xml dom xpath document.evaluate


【解决方案1】:

由于您是 XML 和 XSLT 的新手,因此很高兴确认您不会在这里陷入困境。您正在使用 XPath 搜索 XSLT 样式表。这是一件非常先进/雄心勃勃的事情,很高兴知道它在您的应用程序上下文中是有意义的。那你想解决什么问题呢?

至于细节,我不得不通过对语法不正确的代码进行逆向工程来猜测您的意图,这总是很困难的。我想您可能正在寻找一个 xsl:for-each 指令,其 select 属性具有一般形式

书[作者 = ....]

并且您想对“....”是什么施加一些限制,但除此之外,我无法真正说出您在做什么。此外,如果您想“宽容”,那么您可能希望在可能出现空白的地方允许空白等。可能是正则表达式匹配将满足您的需求(正则表达式在 XPath 2.0 中可用),但是我真的说不出来。

【讨论】:

    【解决方案2】:

    如果您要评估 XPath 表达式所依据的 XSLT 样式表包含此片段

       <xsl:for-each select=
        "book[contains(author, ZZZZZ)]">
    
         <!-- Code here. -->
        </xsl:for-each>
    

    那么选择这个 xsl:for-each 元素的一个 XPath 表达式(如果存在的话,可以选择其他这样的元素)是:

    //xsl:for-each
          [
           @select = 'book[contains(author, ZZZZZ)]'
          ]
    

    基于 XSLT 的验证

    以下变换时:

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes"/>
    
     <xsl:template match="/">
      <xsl:copy-of select=
      "//xsl:for-each
          [@select = 'book[contains(author, ZZZZZ)]'
          ]
      "/>
     </xsl:template>
    </xsl:stylesheet>
    

    应用于此 XML 文档

    <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="node()|@*">
       <xsl:for-each select=
        "book[contains(author, ZZZZZ)]">
    
         <!-- Code here. -->
        </xsl:for-each>
     </xsl:template>
    
    </xsl:stylesheet>
    

    它选择想要的元素并将其作为结果输出

    <xsl:for-each xmlns:xsl="http://www.w3.org/1999/XSL/Transform" select="book[contains(author, ZZZZZ)]">
    
         <!-- Code here. -->
        </xsl:for-each>
    

    【讨论】:

      【解决方案3】:

      您通常可以使用样式表参数来实现您想要的:查找 xsl:param。如果您想提供的不仅仅是一个搜索值作为参数(例如,如果搜索项的数量是可变的),那么有时最好的解决方案是调用 xx:evaluate() - 许多 XSLT 处理器都有一个扩展,允许XPath 表达式作为要动态构造和评估的字符串提供。最后,在执行之前修改样式表是一种选择:不是最简单的,但有时是正确的答案。定位要修改的元素的最简单、最灵活的方法是给它一个 xml:id 属性:

      <xsl:for-each select="...." xml:id="point-of-change">
        ...
      </xsl:for-each>
      

      【讨论】:

        猜你喜欢
        • 2018-12-05
        • 1970-01-01
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 2021-03-05
        相关资源
        最近更新 更多