如何修改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>
修改说明
- 过滤无效
<rec>:在遍历<rec>时,通过[st/@Code]筛选出存在有效st/@Code属性的节点,直接排除没有该属性的<rec>,避免生成空的<st>节点。 - 过滤无效
<rF>:在选取<rF>时,增加条件and recs/rec[st/@Code],只保留至少包含一个有效<rec>的<rF>节点,自动移除所有<rec>都无效的<rF>。
内容的提问来源于stack exchange,提问作者user13583928
相关产品推荐
相关产品推荐

