我有这段代码,我一直用它来根据搜索到的名称过滤掉字段。问题是我需要它在用户可以键入的内容方面有点宽容。所以我必须使用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函数来提高搜索的灵活性。
谢谢你的帮助
答案 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>