xpath:将标记化列表与另一个标记化列表进行比较

xpath:将标记化列表与另一个标记化列表进行比较,xpath,Xpath,在xslt中,我有一个变量,它有一个字符串,以空格作为分隔符。 变量1=‘猫狗牛’ 存在以下xml,“name”属性的值以空格作为分隔符 <top_element> <element_10> <element_11> <element_000 name="cow cat"> string_1 </element_000> </element_11> </element_10> <

在xslt中,我有一个变量,它有一个字符串,以空格作为分隔符。 变量1=‘猫狗牛’

存在以下xml,“name”属性的值以空格作为分隔符

<top_element>

<element_10>    
<element_11>    
<element_000 name="cow cat">
string_1 
</element_000>
</element_11>
</element_10>    

<element_20 name="bat">
<element_21>        
<element_000 name="cow cat">
string_2
</element_000>
</element_21>
</element_20>   

<element_30 name="bat dog">
<element_31>        
<element_000 name="cow cat">
string_3
</element_000>
</element_31>
</element_30>

<element_40 >
<element_41>        
<element_000 name="cow bat">
string_4
</element_000>
</element_41>
</element_40>

</top_element>

字符串_1
字符串2
字符串_3
串4
问题:

仅当元素的祖先或自身:

  • 未定义名称属性,或

  • “name”属性的值至少包含一个“var_1”值

  • 使用xslt解析xml时,输出html应仅包含以下字符串: 字符串_1 字符串_3 串4

    字符串_2不应显示,因为其祖先的名称值与var_1列表中的任何值都不匹配

    我的尝试: 注意:我使用的是xslt 2.0版

    <xsl:template match="element_000">
    <choose>
    <xsl:when test"(ancestor-or-self::*[(tokenize(@name,'\s+')) != (tokenize($var_1,'\s+'))])">
    
    
    

    
    
    这种方法对我不起作用。请让我知道这是否有可能通过其他方式

    谢谢 SRB.

    如果您使用

    <xsl:stylesheet version="2.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:param name="var_1" select="'cat dog cow'"/>
    <xsl:variable name="names" select="tokenize($var_1, ' ')"/>
    
    <xsl:template match="text()"/>
    
    <xsl:template match="element_000[every $el in ancestor-or-self::* 
                                     satisfies (not(exists($el/@name)) or $names = tokenize($el/@name, ' '))]">
      <xsl:copy-of select="."/>
    </xsl:template>
    
    </xsl:stylesheet>
    
    
    
    然后输出只包含元素

    <element_000 name="cow cat">
    string_1
    </element_000><element_000 name="cow cat">
    string_3
    </element_000><element_000 name="cow bat">
    string_4
    </element_000>
    
    
    字符串_1
    字符串_3
    串4
    
    在显示输出的先决条件中,您说匹配可以是元素的祖先或自我。但是,
    string_2
    不显示,因为尽管对于
    self
    有两个匹配项(
    cat
    cow
    )。这不是一个矛盾吗?如果父/祖先元素设置了name属性,并且其值与任何var_1值都不匹配,那么字符串_2不应该显示。因此,条件将是
    ((名称在self中匹配)或(名称在self中为空))和((名称在祖先中为空)或(名称在祖先中匹配))
    ?基本上,您必须用
    替换顶级
    ?谢谢您的评论。是的,完全一样,我想要同样的东西。但是xpath中没有关于祖先和自我的规定。我说得对吗?你有什么技巧可以做到这一点吗。请分享。谢谢。我是否应该添加任何名称空间来完成这项工作?在运行时,它会失败。从理论上讲,通过这个更改,我认为字符串5也会被选中,这是不期望的(在下面提到的示例中)。如果是这样,请告诉我。string_5@srb,您使用哪种XSLT 2.0处理器,您到底得到了哪种故障错误消息或行为?@srb,对于该
    string_5
    ,它将不会被输出,因为它有一个
    name
    属性,该属性的值与
    $names
    中的任何值都不相等。它不会在控制台中显示任何错误消息。它将在不生成输出文件的情况下退出。我使用的代码如下:
    <element_000 name="cow cat">
    string_1
    </element_000><element_000 name="cow cat">
    string_3
    </element_000><element_000 name="cow bat">
    string_4
    </element_000>