如何使用XSLT重排Rice标签并移除空标签?
使用XSLT调整元素顺序并移除空标签的解决方案
以下是实现需求的XSLT代码,核心思路是通过身份模板保留大部分XML结构,仅对<Details>下的元素做自定义排序和过滤:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:默认复制所有节点、属性和文本 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 自定义处理<Details>元素,调整Rice顺序并移除空标签 --> <xsl:template match="Details"> <xsl:copy> <!-- 先复制所有非<Rice>的子元素 --> <xsl:apply-templates select="*[not(local-name()='Rice')]"/> <!-- 输出<Rice>123</Rice> --> <xsl:apply-templates select="Rice[text()='123']"/> <!-- 输出<Rice>long-grain</Rice> --> <xsl:apply-templates select="Rice[text()='long-grain']"/> </xsl:copy> </xsl:template> <!-- 匹配空的<Rice>标签(包括<Rice/>和<Rice></Rice>),不输出 --> <xsl:template match="Rice[not(node())]"/> </xsl:stylesheet>
代码说明:
- 身份模板:确保XML中大部分结构(如
<Company>、<FarmName>、其他非Rice元素)原封不动复制,只修改需要调整的部分。 - 模板:
- 先复制所有不是
<Rice>的子元素,保持原有顺序; - 单独选中并输出文本为
123的<Rice>元素; - 接着选中并输出文本为
long-grain的<Rice>元素;
- 先复制所有不是
- 空
过滤 :通过匹配没有子节点(包括空文本)的<Rice>元素,直接跳过输出,实现移除效果。
原始XML:
<Company> <FarmName addressID="123465789"> <Name xml:lang="en">Main Farm</Name> <Details> <Milk>Jodie Forster</Milk> <Bajra>ESRKSC</Bajra> <Rice>long-grain</Rice> <Rice>123</Rice> <Rice/> <Jowar>852</Jowar> <Lobia>WW</Lobia> <Maize>5240</Maize> <Masoor isoCode="US">123</Masoor> </Details> <Email>test@test.net</Email> <Phone> <TelephoneNumber> <AreaOrCityCode/> <Number>123456789</Number> </TelephoneNumber> </Phone> </FarmName> </Company>
转换后期望XML:
<Company> <FarmName addressID="123465789"> <Name xml:lang="en">Main Farm</Name> <Details> <Milk>Jodie Forster</Milk> <Bajra>ESRKSC</Bajra> <Rice>123</Rice> <Rice>long-grain</Rice> <Jowar>852</Jowar> <Lobia>WW</Lobia> <Maize>5240</Maize> <Masoor isoCode="US">123</Masoor> </Details> <Email>test@test.net</Email> <Phone> <TelephoneNumber> <AreaOrCityCode/> <Number>123456789</Number> </TelephoneNumber> </Phone> </FarmName> </Company>
内容的提问来源于stack exchange,提问作者TulioVargas
相关产品推荐
相关产品推荐

