用于选择具有列表中指定的子值的元素的xpath

时间:2013-09-25 12:51:47

标签: xslt xpath xslt-1.0

考虑以下情况:

<xsl:variable name="list">
   <row>
     <webid>2</webid>
   </row>
   <row>
     <webid>3</webid>
   </row>
   <row>
     <webid>4</webid>
   </row>
</xsl:variable>

<!--pseudo code, not sure if it will work in real time-->
<xsl:variable name="addr" select="addresses/item[not(id=$list/webid)]"/>

我想过滤那些ID不在$list webid collection的地址项。我发布的表达式会吗?请指教。

2 个答案:

答案 0 :(得分:2)

在XSLT 1.0中,像这样的变量声明是一个结果树片段,而不是一个节点集,你可以用copy-ofvalue-of做唯一的事情。 - 您无法使用XPath表达式导航到它。你需要

  1. 使用exslt:node-set等扩展功能将RTF转换为实际节点集或
  2. 使用document('')的技巧将样式表本身作为XML文档访问
  3. 选项2仅适用于您的示例,其中变量值是静态XML。如果您有一个变量,其值是使用xsl:命令或属性值模板构建的,例如

    <xsl:variable name="allNames">
      <xsl:for-each select="name">
        <person name="{.}" />
      </xsl:for-each>
    </xsl:variable>
    

    然后你必须使用node-set函数。 document('')方法会为name属性提供实际的xsl:for-each元素和{.}的字面值,而不是评估它的结果。

    选项1

    xmlns:exslt="http://exslt.org/common" exclude-result-prefixes="exslt"添加到您的<xsl:stylesheet>代码中,然后使用

    <xsl:variable name="addr" select="addresses/item[
         not(id=exslt:node-set($list)/row/webid)]"/>
    

    选项2

    <xsl:variable name="addr" select="addresses/item[
         not(id=document('')//xsl:variable[name='list']/row/webid)]"/>
    

答案 1 :(得分:0)

我没有(地址/项目[id = $ list / webid])