XSLT:基于属性拆分 xml 文件
Posted
技术标签:
【中文标题】XSLT:基于属性拆分 xml 文件【英文标题】:XSLT: splitting xml file based on attribute 【发布时间】:2021-12-14 12:47:07 【问题描述】:我有一个 xml 文件,其中包含课程 A 和 B 的参与者。所有参与者都分组。 03 组学习了 A 级课程。
<contacts>
<contact>
<informalname>Jan</informalname>
<formalname>met de Pet</formalname>
<cursus level="LevelA" group="03">
<coursetown>Amsterdam</coursetown>
<coursedate>4 and 11 March 2021</coursedate>
<coursename>Fantastic Course A</coursename>
</cursus>
<cursus level="LevelB" group="05">
<coursetown>Rotterdam</coursetown>
<coursedate>15 and 22 november 2021</coursedate>
<coursename>Fantastic Course Level B</coursename>
</cursus>
</contact>
<contact>
<informalname>Maria</informalname>
<formalname>Zusenzo</formalname>
<cursus level="LevelA" group="01">
<coursetown>Amsterdam</coursetown>
<coursedate>2 and 16 november 2020</coursedate>
<coursename>Fantastic Course A</coursename>
</cursus>
<cursus level="LevelB" group="05">
<coursetown>Rotterdam</coursetown>
<coursedate>15 and 22 november 2021</coursedate>
<coursename>Fantastic Course Level B</coursename>
</cursus>
</contact>
</contacts>
我可以将 xml 文件拆分为子文件,从而可以生成考勤列表和证书。但结果仍然包含参与者所在的其他组的信息。
我的意图是将 xml 文件拆分为关于组号的单独文件,其中包含有关参与者的信息,并且仅包含与该特定组的课程/课程有关的数据。
在组“05”的情况下,所需的输出如下:
<contacts>
<contact>
<informalname>Jan</informalname>
<formalname>met de Pet</formalname>
<cursus level="LevelB" group="05">
<coursetown>Rotterdam</coursetown>
<coursedate>15 and 22 november 2021</coursedate>
<coursename>Fantastic Course Level B</coursename>
</cursus>
</contact>
<contact>
<informalname>Maria</informalname>
<formalname>Zusenzo</formalname>
<cursus level="LevelB" group="05">
<coursetown>Rotterdam</coursetown>
<coursedate>15 and 22 november 2021</coursedate>
<coursename>Fantastic Course Level B</coursename>
</cursus>
</contact>
</contacts>
我现在使用以下 xslt 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="contacts">
<xsl:for-each-group select="contact" group-by="cursus/@group">
<xsl:result-document href="groep-current-grouping-key().xml">
<contacts>
<xsl:apply-templates select="current-group()"/>
</contacts>
</xsl:result-document>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
我尝试使用
【问题讨论】:
【参考方案1】:添加
<xsl:template match="contact/cursus">
<xsl:if test="@group = current-grouping-key()">
<xsl:next-match/>
</xsl:if>
</xsl:template>
仅复制匹配的cursus
元素。
【讨论】:
非常感谢,它有效! -- 我删除了:)]。现在是:以上是关于XSLT:基于属性拆分 xml 文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 XSLT 基于 ID 从多个 xPath 中选择 XML 节点
有没有办法使用 XSLT 基于 XML 中的元素复制 XML 节点 n 次?