问题描述
我需要有关此简单 xslt 循环的帮助。 需要为匹配选择所有匹配的 DocInstance 循环 (Transetconnum2/Transetconnum = DocInstance/set_ctrl_nbr) 低于 XML。
<Documents>
<Transetconnum2>
<Transetconnum>0001</Transetconnum>
<Transetconnum>0003</Transetconnum>
</Transetconnum2>
<DocInstance>
<doc_ref_id>9178191-RBTW</doc_ref_id>
<set_ctrl_nbr>0001</set_ctrl_nbr>
<grp_ctrl_nbr>206875</grp_ctrl_nbr>
<int_ctrl_nbr>682651</int_ctrl_nbr>
</DocInstance>
<DocInstance>
<doc_ref_id>9178192-RBTW</doc_ref_id>
<set_ctrl_nbr>0002</set_ctrl_nbr>
<grp_ctrl_nbr>206875</grp_ctrl_nbr>
<int_ctrl_nbr>682651</int_ctrl_nbr>
</DocInstance>
<DocInstance>
<doc_ref_id>9178193-RBTW</doc_ref_id>
<set_ctrl_nbr>0003</set_ctrl_nbr>
<grp_ctrl_nbr>206875</grp_ctrl_nbr>
<int_ctrl_nbr>682651</int_ctrl_nbr>
</DocInstance>
</Documents>
预期输出:
<Documents>
<DocInstance>
<doc_ref_id>9178191-RBTW</doc_ref_id>
<set_ctrl_nbr>0001</set_ctrl_nbr>
<grp_ctrl_nbr>206875</grp_ctrl_nbr>
<int_ctrl_nbr>682651</int_ctrl_nbr>
</DocInstance>
<DocInstance>
<doc_ref_id>9178193-RBTW</doc_ref_id>
<set_ctrl_nbr>0003</set_ctrl_nbr>
<grp_ctrl_nbr>206875</grp_ctrl_nbr>
<int_ctrl_nbr>682651</int_ctrl_nbr>
</DocInstance>
</Documents>
解决方法
这里不需要任何循环(当然也不是“嵌套循环”)。只需复制与“允许”值匹配的节点:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/Documents">
<xsl:copy>
<xsl:copy-of select="DocInstance[set_ctrl_nbr = ../Transetconnum2/Transetconnum]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
有关解释,请阅读 XPath 规范中定义的 comparison rules:
如果要比较的两个对象都是节点集,那么比较将 当且仅当第一个节点集中有一个节点并且一个 第二个节点集中的节点,这样执行的结果 两个节点的字符串值比较为真。