在 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 中执行相同的操作。
XML答:
<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
returns
<name>kkk</name>
<name>xxx</name>
对我来说。检查性能是否提高。
下面是两个 XML 文件。我想使用 name
字段将 XMLA 过滤为仅存在于 XMLB 中的那些人。
两个 XML 文档都存储在变量 $XMLA 和 $XMLB 中。
我使用 XQuery 1.0 创建了输出,但我不确定如何在 XSLT 1.0 中执行相同的操作。
XML答:
<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
returns
<name>kkk</name>
<name>xxx</name>
对我来说。检查性能是否提高。