XSLT循环转换XML格式遇阻,请求协助处理ICWRRsp格式转换
解决XSLT循环转换的问题
我来帮你搞定这个XML转换的需求,针对你输入的<ICWRRsp>结构,我准备了两种常见场景的解决方案,你可以根据实际目标XML结构调整:
场景1:单独循环处理每个和
如果你的目标是把每个<IcwrId>和<WorkId>分别转换成独立的条目(比如分开归类输出),可以用xsl:for-each遍历对应节点:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 匹配根节点 --> <xsl:template match="/ICWRRsp"> <TargetRoot> <!-- 循环处理所有<IcwrId> --> <IcwrEntries> <xsl:for-each select="IcwrId"> <IcwrEntry> <Id><xsl:value-of select="."/></Id> </IcwrEntry> </xsl:for-each> </IcwrEntries> <!-- 循环处理所有<WorkId> --> <WorkEntries> <xsl:for-each select="WorkId"> <WorkEntry> <Id><xsl:value-of select="."/></Id> </WorkEntry> </xsl:for-each> </WorkEntries> </TargetRoot> </xsl:template> </xsl:stylesheet>
这个XSLT会把所有<IcwrId>包装到<IcwrEntries>下,每个<IcwrId>对应一个<IcwrEntry>,同理处理<WorkId>。
场景2:按位置配对和
如果需要将第一个<IcwrId>和第一个<WorkId>配对,第二个和第二个配对(以此类推),可以通过节点的位置索引position()来关联:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/ICWRRsp"> <TargetRoot> <!-- 遍历所有<IcwrId>,按位置关联对应的WorkId --> <xsl:for-each select="IcwrId"> <CombinedEntry> <IcwrId><xsl:value-of select="."/></IcwrId> <!-- 用position()获取当前IcwrId的位置,找到对应位置的WorkId --> <WorkId><xsl:value-of select="../WorkId[position() = current()/position()]"/></WorkId> </CombinedEntry> </xsl:for-each> </TargetRoot> </xsl:template> </xsl:stylesheet>
小提示
- 如果你的目标XML结构和上面的示例不同,只需要修改
<TargetRoot>、<CombinedEntry>这类自定义标签,以及内部的节点结构即可。 - 要是
<IcwrId>和<WorkId>的数量不一致,上面的配对逻辑会忽略多余的节点(比如IcwrId比WorkId多的话,后面的IcwrId对应的WorkId会为空)。
内容的提问来源于stack exchange,提问作者Lavanya Komarasamy
相关产品推荐
相关产品推荐

