Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xpath中的节点集_Xml_Xslt_Xpath - Fatal编程技术网

Xml xpath中的节点集

Xml xpath中的节点集,xml,xslt,xpath,Xml,Xslt,Xpath,我正在编写一个xslt样式表来将一个xml转换为另一个xml 以下是原始xml的简化版本: <eml> <datatable> <physical> <distribution id="100"/> </physical> </datatable>

我正在编写一个xslt样式表来将一个xml转换为另一个xml

以下是原始xml的简化版本:

 <eml>
        <datatable>
                 <physical>
                     <distribution id="100"/>
                 </physical>
       </datatable>                 

       <software>
           <implementation>
              <distribution id="200"/>
            </implementation>
      </software>
     <additionalMetadata>
        <describes>100</describes>
        <describes>200</describes>
        <describes>300</describes>
        <describes>400</describes>
    </additionalMetadata>
   </eml>
(100和200是
//物理/分销
软件/实施/分销
的属性id值)

我写了这样的东西:

<xsl:with-param name="describes-list" 
                select="./describes[//physical/distribution/@id !=. and
                             //software/implementation/distribution/@id != .] "/>

它适用于上述示例。然而,datatable和软件的元素是可重复的。因此,此xml是有效的:

<eml>
    <datatable>
             <physical>
                 <distribution id="100"/>
             </physical>
   </datatable> 

  <datatable>
             <physical>
                 <distribution id="300"/>
             </physical>
   </datatable>                

   <software>
       <implementation>
          <distribution id="200"/>
       </implementation>
  </software>
 <additionalMetadata>
    <describes>100</describes>
    <describes>200</describes>
    <describes>300</describes>
    <describes>400</describes>
  </additionalMetadata>
</eml>

100
200
300
400
但我的xslt在上述示例中不起作用:(

你介意解释一下吗?先谢谢你


Jing

这是一个经常犯的错误。当一个或两个操作数都是节点集时,切勿使用

value!=节点集

根据定义,如果节点集中存在一个节点n,那么

不等于
字符串(n)

你想要的是

不等于节点集中的任何节点

这可以用以下方式表示:

value=节点集

如果节点集中至少存在一个节点n,则为true,例如:

value=string(n)

然后

not(值=节点集)

如果节点集中不存在任何节点n,则为true

value=string(n)

因此,以下XPath表达式将选择所需的节点

/*/*/describes[not(. = ../../*/physical/distribution/@id) and not(. = ../../*/implementation/distribution/@id)] /*/*/描述[非(..=../../*/physical/distribution/@id) 及 不是(..=../../*/implementation/distribution/@id)] 我个人更喜欢将上下文节点与两个节点集的并集进行一次比较:

/*/*/describes [not(. = (../../*/physical/distribution/@id | ../../*/implementation/distribution/@id ) ) ] /*/*/描述 [非(.=(../../*/physical/distribution/@id) | ../../*/implementation/distribution/@id ) ) ] 请注意,我避免使用“/”缩写。它通常非常昂贵(效率低下),只有在我们不知道XML文档的结构时才应该使用

当然,上述XPath表达式必须根据以下XML文档(问题中提供的第二个文档)进行评估:

100 200 300 400 /*/*/describes [not(. = (../../*/physical/distribution/@id | ../../*/implementation/distribution/@id ) ) ] <eml> <datatable> <physical> <distribution id="100"/> </physical> </datatable> <datatable> <physical> <distribution id="300"/> </physical> </datatable> <software> <implementation> <distribution id="200"/> </implementation> </software> <additionalMetadata> <describes>100</describes> <describes>200</describes> <describes>300</describes> <describes>400</describes> </additionalMetadata> </eml>