我有一个名为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>
实际上根元素的确切名称并不重要。