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

时间:2013-12-18 10:16:09

标签: xpath

在xslt中我有一个变量,它有一个字符串,空格为分隔符。 var_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>

问题:

只有在元素的祖先或自我的情况下处理xml中的element_000:

  1. 未定义名称属性或

  2. 'name'属性的值至少包含一个值'var_1。

  3. 在使用xslt解析xml时,输出html应仅包含以下字符串: STRING_1 STRING_3 STRING_4

    不应显示string_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+'))])">
    

    &lt; - 处理元素 - &gt;

    </xsl:when>
    </xsl:choose>
    </xsl:template>
    

    这种方法对我不起作用。如果可以通过其他方式告诉我,请告诉我。

    由于 SRB。

1 个答案:

答案 0 :(得分:1)

如果您使用

<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>