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. 我发布的表情会做吗?请指教。

4

2 回答 2

2

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

  1. 使用exslt:node-set等扩展函数将 RTF 转换为真实节点集或
  2. 使用技巧document('')将样式表本身作为 XML 文档进行访问

选项 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)]"/>
于 2013-09-25T13:07:31.283 回答
0

我放的不是(addresses/item[id=$list/webid])

于 2013-09-25T13:50:24.413 回答