过滤xml节点,比较两个节点列表

时间:2013-06-11 13:28:14

标签: xslt filtering

我有两个节点列表,如下所示:

第一个清单:

<WebAddresses>
  <item>
   <AddressID>01</AddressID>
   <Street>Street01</Street>
   <State>Idaho<State>
   <Country>US</Country>
  <item>
  <item>
   <AddressID>02</AddressID>
   <Street>Street02</Street>
   <State>Kentucky<State>
   <Country>US</Country>
  <item>
</WebAddresses>

第二份清单

<Addresses>
  <row>
    <WebID>02</WebID>
    <Line1>Line1</Line1>
    <Line2>Line1</Line2>
    <State>Lousiana</State>
    <Country>US</Country>
  </row>
  <row>
    <WebID>03</WebID>
    <Line1>Line1</Line1>
    <Line2>Line2</Line2>
    <State>California</State>
    <Country>US</Country>
  </row>
</Addresses>

在我的xslt中我有

<xsl:variable name="webAddr" select="$webXML\\WebAddresses"/>
<xsl:variable name="appAddr" select="$AppXML\\Addresses"/>

我想过滤第二个列表,从而消除第一个列表项中包含WebID的行,因此输出列表只包含WebID=03行。我尝试了以下方法:

 <xsl:variable name="leftX" select="$appAddr[not(WebID=$webAddr/AddressID)]"/>

但它不是过滤数据,而是返回未更改的appAddr列表。我可以通过.net代码完成它,但是正在寻找一种xslt方式。请帮忙。

1 个答案:

答案 0 :(得分:0)

你需要做一些事情才能发挥作用。

首先,webAddrappAddr变量包含无效的XPath。将这些更改为:

<xsl:variable name="webAddr" select="$webXML//WebAddresses"/>
<xsl:variable name="appAddr" select="$AppXML//Addresses"/>

(或者,更好的是,如果您知道所需的确切XPath,请尽量避免有时浪费的//轴)。

其次,将您的leftX变量更改为:

<xsl:variable name="leftX" select="$appAddr/row[WebID = $webAddr/item/AddressID)]"/>

此模板会删除<row>个孩子的值等于<WebID>的{​​{1}}个孙子的所有<AddressID>个元素。