xpath:将标记化列表与另一个标记化列表进行比较
在xslt中,我有一个变量,它有一个字符串,以空格作为分隔符。 变量1=‘猫狗牛’ 存在以下xml,“name”属性的值以空格作为分隔符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> <
<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
问题:
仅当元素的祖先或自身:
<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>