You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改XSLT移除空<st>的<rec>及无有效<rec>的<rF>

XML转换需求与解决方案

现有输入XML

<Main>
    <rFs>
        <rF>
            <iT>T</iT>
            <ref>F1</ref>
            <recs>
                <rec>
                    <iT>T</iT>
                    <ref>T0</ref>
                    <cT Code="R" Des="Regular">R</cT>
                    <fT Code="N" Description="National">N</fT>
                    <st Code="D" Description="Dock">D</st>
                </rec>
                <rec>
                    <iT>T</iT>
                    <ref>T0</ref>
                    <cT Code="R" Des="Regular">R</cT>
                    <fT Code="Q" Description="Mad">Q</fT>
                </rec>
            </recs>
        </rF>
        <rF>
            <iT>T</iT>
            <ref>F2</ref>
            <recs>
                <rec>
                    <iT>T</iT>
                    <ref>T1</ref>
                    <cT Code="S" Des="Regular">R</cT>
                    <fT Code="N" Description="Inter">I</fT>
                </rec>
                <rec>
                    <iT>T</iT>
                    <ref>T1</ref>
                    <cT Code="S" Description="Time">R</cT>
                    <fT Code="Q" Description="Mad">Q</fT>
                </rec>
            </recs>
        </rF>
    </rFs>
</Main>

原有XSLT

<xsl:template match="Main">
    <rFs>
        <xsl:for-each select="rFs/rF[iT = 'T']">
            <rF>
                <xsl:attribute name="id">
                    <xsl:value-of select="concat(ref,'_','fam')"/>
                </xsl:attribute>
                <recs>
                    <xsl:for-each-group select="recs/rec" group-by="ref">
                        <xsl:for-each select="current-group()">
                            <rec>
                                <xsl:attribute name="id">
                                    <xsl:value-of select="ref"/>
                                </xsl:attribute>
                                <st>
                                    <xsl:value-of select="st/@Code"/>
                                </st>
                            </rec>
                        </xsl:for-each>
                    </xsl:for-each-group>
                </recs>
            </rF>
        </xsl:for-each>
    </rFs>
</xsl:template>

原有输出XML

<rFs>
    <rF id="F1_fam">
        <recs>
            <rec id="T0">
                <st>D</st>
            </rec>
            <rec id="T0">
                <st/>
            </rec>
        </recs>
    </rF>
    <rF id="F2_fam">
        <recs>
            <rec id="T1">
                <st/>
            </rec>
            <rec id="T1">
                <st/>
            </rec>
        </recs>
    </rF>
</rFs>

转换需求

  • 移除所有<st>为空的<rec>节点;
  • 若某个<rF>下的所有<rec>的<st>均为空,则移除整个<rF>节点。

修改后的XSLT

<xsl:template match="Main">
    <rFs>
        <!-- 只保留包含有效rec的rF -->
        <xsl:for-each select="rFs/rF[iT = 'T' and recs/rec[st/@Code]]">
            <rF>
                <xsl:attribute name="id">
                    <xsl:value-of select="concat(ref,'_','fam')"/>
                </xsl:attribute>
                <recs>
                    <xsl:for-each-group select="recs/rec[st/@Code]" group-by="ref">
                        <xsl:for-each select="current-group()">
                            <rec>
                                <xsl:attribute name="id">
                                    <xsl:value-of select="ref"/>
                                </xsl:attribute>
                                <st>
                                    <xsl:value-of select="st/@Code"/>
                                </st>
                            </rec>
                        </xsl:for-each>
                    </xsl:for-each-group>
                </recs>
            </rF>
        </xsl:for-each>
    </rFs>
</xsl:template>

最终输出XML

<rFs>
    <rF id="F1_fam">
        <recs>
            <rec id="T0">
                <st>D</st>
            </rec>
        </recs>
    </rF>
</rFs>

修改说明

  1. 过滤无效<rec>:在遍历<rec>时,通过[st/@Code]筛选出存在有效st/@Code属性的节点,直接排除没有该属性的<rec>,避免生成空的<st>节点。
  2. 过滤无效<rF>:在选取<rF>时,增加条件and recs/rec[st/@Code],只保留至少包含一个有效<rec>的<rF>节点,自动移除所有<rec>都无效的<rF>。

内容的提问来源于stack exchange,提问作者user13583928

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:20:39