编写XSLT实现XML转CSV:判断mast是否存在ispast为true的日期
XSLT 实现XML到CSV的转换:根据子节点值判断父节点输出字段
需求说明
遍历XML中的<mast>节点,检查其下属<dates>/<date>节点的<ispast>值:
- 若任意一个
<ispast>的内容为true,则该<mast>对应的CSV行中ispast字段为true - 若所有
<ispast>的内容都是false,则ispast字段为false
示例XML输入
<inst > <mast id="1"> <dates> <date> <filedate>2022</filedate> <ispast>false</ispast> </date> <date> <filedate>2023</filedate> <ispast>false</ispast> </date> <date> <filedate>2020</filedate> <ispast>true</ispast> </date> </dates> </mast> <mast id="2"> <dates> <date> <filedate>2022</filedate> <ispast>false</ispast> </date> <date> <filedate>2023</filedate> <ispast>false</ispast> </date> <date> <filedate>2025</filedate> <ispast>false</ispast> </date> </dates> </mast> </inst>
期望CSV输出
id,ispast 1,true 2,false
解决方案:XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" /> <!-- 输出CSV表头 --> <xsl:template match="/"> <xsl:text>id,ispast </xsl:text> <xsl:apply-templates select="inst/mast" /> </xsl:template> <!-- 处理每个mast节点 --> <xsl:template match="mast"> <!-- 获取id属性值 --> <xsl:value-of select="@id" /> <xsl:text>,</xsl:text> <!-- 判断是否存在ispast为true的子节点 --> <xsl:choose> <xsl:when test="exists(dates/date/ispast[text()='true'])"> <xsl:text>true</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>false</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet>
代码逻辑说明
- 输出设置:通过
<xsl:output method="text" />指定输出为纯文本格式,匹配CSV的格式要求。 - 表头输出:根模板匹配后先输出CSV表头行,再遍历所有
<inst>/<mast>节点。 - 节点处理:
- 提取当前
<mast>的id属性值并输出。 - 使用
exists(dates/date/ispast[text()='true'])检查当前节点下是否存在任意一个<ispast>内容为true的子节点,根据结果输出对应的true或false。 - 每行末尾添加换行符
保证CSV的行结构正确。
- 提取当前
内容的提问来源于stack exchange,提问作者anudeep
相关产品推荐
相关产品推荐

