繁体   English   中英

使用节点从XSLT 1.0中的第二个XML过滤一个XML

[英]Filtering one XML using nodes from a second XML in XSLT 1.0

以下是两个XML文件。 我想使用name字段将XMLA过滤为仅存在于XMLB中的人员。

这两个XML文档都存储在变量$ XMLA和$ XMLB中。

我使用XQuery 1.0创建了输出,但是我不确定如何在XSLT 1.0中执行相同的操作。

XMLA:

<table>
 <row>
  <name>NNN</name>
  <address>1234 NN</address>
  <phone>23423423</phone>
 </row>
 <row>
  <name>kkk</name>
  <address>1234 KK</address>
  <phone>4343434</phone>
  </row>
</table>

XMLB:

<table>
 <row>
  <id>1111</id>
  <batch>1212</batch>
  <name>NNN</name>
 </row>
 <row>
  <id>2222</id>
  <batch>2121</batch>
  <name>kkk</name>
 </row>
</table>

XQuery:

for $y in fn:doc('XMLA.xml')/table/row
for $x in fn:doc('XMLB.xml')/table/row
for $a in $x/name
where $y/name = $a
order by $y/name
return $y

我之所以考虑使用XSLT,是因为使用XQuery对大型XML文件进行解析非常慢。 我不确定这是否是因为我的XQuery构建错误,但是我想尝试XSLT并比较效率。

看来您的XQuery方法为文档A中的每个<row>分配了一个全新的文档B。

使用变量一次存储文档。

xquery version "1.0";

(: your call to fn:doc('XMLA.xml') here :)
let $A := <table>
 <row>
  <name>NNN</name>
 </row>
 <row>
  <name>kkk</name>
 </row>
 <row>
  <name>xxx</name>
 </row>
</table>

(: your call to fn:doc('XMLB.xml') here :)
let $B := <table>
 <row>
  <name>nnnn</name>
 </row>
 <row>
  <name>kkk</name>
 </row>
 <row>
  <name>xxx</name>
 </row>
</table>

let $nameA := $A/row/name
let $nameB := $B/row/name

for $name in $nameA
where $name = $nameB
order by $name
return $name

退货

<name>kkk</name>
<name>xxx</name>

为了我。 检查性能是否提高。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM