如何在document.evaluate()中使用XPath contains()函数



我有这段代码,我一直使用它来过滤出基于搜索名称的字段。问题是,我需要它在用户可以输入的内容方面稍微宽容一些。所以我要用contains函数。我已经得到了它在其他代码片段的工作,但我不确定如何使用它与以下:

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一般都很陌生,所以如果可能的话,我需要一点简化。


回复Michael Kay -

你好,我正试图将搜索的术语/单词应用于XSLT表中的作者字段。是的,你是对的,这就是我正在努力做的。编辑样式表并在输入表单中应用条件集。到目前为止,我一直在使用预构建的函数。根据需要修改。如果硬编码输入搜索的值,我可以使包含工作外部。然而,我想做它的"飞行",因为它是,我真的只是不知道如何得到这个工作在我之后的上下文中。我实际上拥有的是在表单中构建的查询-指定要搜索的字段,操作数和搜索项。但是我不想搜索整个字符串,因为那有点不灵活——所以我想使用contains函数来允许搜索的灵活性。

谢谢你的帮助

由于您是XML和XSLT的新手,因此最好确认一下您在这里没有掉进兔子洞。您正在使用XPath搜索XSLT样式表。这是一件非常高级/雄心勃勃的事情,如果知道它在应用程序的上下文中是有意义的,那就太好了。那么你想解决什么问题呢?

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

book[author = ....]

,你想对"...."是什么设置一些限制,但除此之外,我真的不知道你在做什么。此外,如果你想要"宽容",那么你可能想要在可以出现空白的地方允许空白,等等。也许正则表达式匹配可以满足您的需要(XPath 2.0中提供了正则表达式),但是我真的不能确定。

如果要对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>

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

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

最新更新