如何在使用 XSLT 1.0 进行复制合并后对数据进行分组



我有一个名为paths的xml.xml它可以包含1到X个XMl文件的文件路径,我需要将其合并为一个以进行进一步处理。

我使用下面的样式表来执行此操作,但现在我需要在同一转换中按输出文件中的属性对数据进行分组。我已经研究了muenchian分组,但无法弄清楚如何在进行复制的同一样式表中实现它?

每个 XML 仅包含其组的标记。我想要实现的输出是,每个XML都分组到一个新元素下,并将groups属性名称作为其值。

有什么想法吗?

我的样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" 
            doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
            doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" indent="yes" omit-xml-declaration="no" />
            <xsl:template match="/">
        <xsl:copy-of select="document(document('paths.xml')//file/path)/*/node()"/>
    </xsl:template>
</xsl:stylesheet>

合并前的 XML 示例:

<?xml version="1.0" encoding="UTF-8"?>
<tags generator="xmlgenerator" id="123">
  <tag group="group1">
    <title lang="eng">title1</title>
</tag>
  <tag group="group1">
    <title lang="se">title2</title>
</tag>
  <tag group="group1">
    <title lang="eng">title3</title>
</tag>
</tags>

想要的输出:

<?xml version="1.0" encoding="UTF-8"?>
<tagcollection>
<group1>
  <tag>
    <title lang="rus">title1</title>
</tag>
  <tag>
    <title lang="se">title2</title>
</tag>
</group1>
<group2>
  <tag>
    <title lang="eng">title1</title>
</tag>
  <tag>
    <title lang="se">title2</title>
</tag>
</group2>
</tagcollection>

更改

        <xsl:template match="/">
    <xsl:copy-of select="document(document('paths.xml')//file/path)/*/node()"/>
</xsl:template>

<xsl:template match="/">
  <tagcollection>
    <xsl:apply-templates select="document(document('paths.xml')//file/path)/*"/>
  </tagcollection>
</xsl:template>

,然后添加 Muenchian 分组的键

<xsl:key name="group" match="tag" use="@group"/>

以及用于按以下行分组的模板

<xsl:template match="/*">
  <xsl:apply-templates select="tag[generate-id() = generate-id(key('group', @group)[1])]" mode="group"/>
</xsl:template>
<xsl:template match="tag" mode="group">
  <xsl:element name="{@group}">
    <xsl:apply-templates select="key('group', @group)"/>
  </xsl:element>
</xsl:template>
<xsl:template match="tag/@group"/>
<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

您还没有显示输入文档的确切结构和嵌套,上面假设的结构如下

<root>
  <tag group="group1">
    <title lang="eng">title1</title>
</tag>
  <tag group="group1">
    <title lang="se">title2</title>
</tag>
  <tag group="group1">
    <title lang="eng">title3</title>
</tag>
</root>

实际上根元素的确切名称并不重要。

最新更新