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

时间:2011-12-19 07:34:30

标签: xml dom xpath document.evaluate

我有这段代码,我一直用它来根据搜索到的名称过滤掉字段。问题是我需要它在用户可以键入的内容方面有点宽容。所以我必须使用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表中的authors字段。 是的,你是对的,这就是我想要做的。编辑样式表并在输入表单中应用条件集。 到目前为止,我一直在使用预建功能。根据需要进行修改。 如果对要搜索的输入的值进行硬编码,我可以使包含在外部工作。但是我想要“即时”实现它并且我真的不确定如何在我所追求的环境中使用它。 我实际拥有的是在表单中构建的查询 - 指定搜索字段,操作数和搜索字词。但我不想搜索整个字符串,因为这有点不灵活 - 所以我想使用contains函数来提高搜索的灵活性。

谢谢你的帮助

3 个答案:

答案 0 :(得分:1)

由于您是XML和XSLT的新手,因此最好确认您不会在这里破坏兔子洞。您正在使用XPath搜索XSLT样式表。这是一个非常先进/雄心勃勃的事情,很高兴知道它在你的应用程序环境中是有意义的。那么你想解决什么问题?

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

book [author = ....]

并且你想对“......”的内容施加一些约束,但除此之外,我无法真正告诉你在做什么。此外,如果你想要'宽容',那么你可能想要在空白可以出现的地方允许空格等。可能正则表达式匹配将满足你的需要(正则表达式在XPath 2.0中可用),但是我实在说不出来。

答案 1 :(得分: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>

答案 2 :(得分:0)

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

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