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

时间:2017-10-24 10:35:27

标签: xml xslt xml-parsing 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>

1 个答案:

答案 0 :(得分:1)

更改

        <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>

实际上根元素的确切名称无关紧要。