Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 如何匹配在另一个序列中包含所有节点的节点_Xslt_Xpath - Fatal编程技术网

Xslt 如何匹配在另一个序列中包含所有节点的节点

Xslt 如何匹配在另一个序列中包含所有节点的节点,xslt,xpath,Xslt,Xpath,我们正在使用XSLT2。想知道这是否可能 我们有一个标签过滤器,客户可以选择查看与其选择的所有主题相匹配的所有主题 以下是XML结构的概念: <themes> <theme> <name>Apple</name> <tags> <tag id="1"> <tag id="2"> </tags> </theme&g

我们正在使用XSLT2。想知道这是否可能

我们有一个标签过滤器,客户可以选择查看与其选择的所有主题相匹配的所有主题

以下是XML结构的概念:

<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))" />