Xslt 如何匹配在另一个序列中包含所有节点的节点
我们正在使用XSLT2。想知道这是否可能 我们有一个标签过滤器,客户可以选择查看与其选择的所有主题相匹配的所有主题 以下是XML结构的概念:Xslt 如何匹配在另一个序列中包含所有节点的节点,xslt,xpath,Xslt,Xpath,我们正在使用XSLT2。想知道这是否可能 我们有一个标签过滤器,客户可以选择查看与其选择的所有主题相匹配的所有主题 以下是XML结构的概念: <themes> <theme> <name>Apple</name> <tags> <tag id="1"> <tag id="2"> </tags> </theme&g
<themes>
<theme>
<name>Apple</name>
<tags>
<tag id="1">
<tag id="2">
</tags>
</theme>
<theme>
<name>Banana</name>
<tags>
<tag id="2">
<tag id="3">
</tags>
</theme>
<theme>
<name>Kiwifruit</name>
<tags>
<tag id="2">
<tag id="3">
</tags>
</theme>
</themes>
苹果
香蕉
猕猴桃
客户选择标签2和3。我们想要的结果是只显示香蕉和猕猴桃,因为它们有用户选择的所有标签
我们无法使用AND运算符,因为标记列表很长且未知。我们目前将此列表传递到XSLT中,然后标记:
<xsl:param name="tag_ids"/>
<xsl:variable name="tag_id_list" select="tokenize($tag_ids,',')"/>
此语句选择具有任何标记id列表的任何主题:
<xsl:for-each select="themes/theme/tags/tag[@id=$tag_id_list]">
但是我们试图找到一个XPath语句,确保在$tag\u id\u列表中包含所有的s
有什么想法吗?!提前感谢。如果标签必须按正确的顺序排列,您需要:
themes/theme/tags[deep-equal($tag_id_list, tag/@id)]
或者,如果它们可以按任何顺序排列:
themes/theme/tags[
(every $tag in $tag_id_list satisfies $tag = tag/@id)
and
(every $tag in tag/@id satisfies $tag = $tag_id_list)]
您可以计算匹配的标记数,并查看它是否等于
tag\u id\u列表中的标记数。比如说
<xsl:variable name="tagcount" select="count($tag_id_list)" />
<xsl:for-each select="themes/theme[count(tags/tag[@id=$tag_id_list]) = $tagcount]">
你能举一个传递到参数“tag_ids”的数据的例子吗?是的,在这个例子中就是tag_ids='2,3',如果只输入了'2'作为标记,那么所有的水果都应该显示,因为它们都有'2',还是没有显示,因为它们有其他没有输入的标记?谢谢Michael。我只需要该表达式的第一部分($tag_id_列表中的每个$tag都满足$tag=tag/@id),因为如果我只是传入'3',我还想找到香蕉和猕猴桃。他很有魅力。
<xsl:variable name="tagcount" select="count(distinct-values($tag_id_list))" />