考虑以下情况:
<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
中的地址项目。我发布的表达式会起作用吗?请指教。
在 XSLT 1.0 中,像这样的变量声明是结果树片段,而不是节点集,您唯一可以使用它做的是 copy-of
或value-of
- 您无法使用 XPath 表达式导航到它。 您需要
- 使用扩展函数(如 exslt:node-set)将 RTF 转换为实际节点集或
- 使用带有
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)]"/>
我放了 not(addresses/item[id=$list/webid])