微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xslt 从嵌套循环中选择匹配值

如何解决xslt 从嵌套循环中选择匹配值

我需要有关此简单 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

如果要比较的两个对象都是节点集,那么比较将 当且仅当第一个节点集中有一个节点并且一个 第二个节点集中的节点,这样执行的结果 两个节点的字符串值比较为真。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。