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 - 如何根据分隔符拆分每个元素

使用 XSLT 基于 ID 从多个 xPath 中选择 XML 节点

有没有办法使用 XSLT 基于 XML 中的元素复制 XML 节点 n 次?

有没有办法使用 XSLT 基于 XML 中的元素复制 XML 节点 n 次?

基于 XSD 变化的动态 XSLT 生成

使用 XSLT 基于路径选择 XML