Xml 基于子ID值的XSLT分组依据
我想转换一个具有多个header、detail和moretail节点的xml。每个节点都包含键“ID”以将它们连接在一起。Xml 基于子ID值的XSLT分组依据,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我想转换一个具有多个header、detail和moretail节点的xml。每个节点都包含键“ID”以将它们连接在一起。 这看起来很简单,但对我来说不起作用 从以下xml开始: <?xml version="1.0" encoding="UTF-8"?> <File> <Header> <Id>1</Id> <Other>How</Other> </Head
这看起来很简单,但对我来说不起作用 从以下xml开始:
<?xml version="1.0" encoding="UTF-8"?>
<File>
<Header>
<Id>1</Id>
<Other>How</Other>
</Header>
<Detail>
<Id>1</Id>
<Other>to</Other>
</Detail>
<MoreDetails>
<Id>1</Id>
<Other>group</Other>
</MoreDetails>
<Header>
<Id>2</Id>
<Other>How</Other>
</Header>
<Detail>
<Id>2</Id>
<Other>to</Other>
</Detail>
<MoreDetails>
<Id>2</Id>
<Other>group</Other>
</MoreDetails>
<MoreDetails>
<Id>2</Id>
<Other>may have multiples</Other>
</MoreDetails>
</File>
1.
怎么
1.
到
1.
组
2.
怎么
2.
到
2.
组
2.
可能有倍数
使用Group1、Group2等或groupvalue=1、groupvalue=2等生成如下内容
<?xml version="1.0" encoding="UTF-8"?>
<File>
<Group value="1">
<Header>
<Id>1</Id>
<Other>How</Other>
</Header>
<Detail>
<Id>1</Id>
<Other>to</Other>
</Detail>
<MoreDetails>
<Id>1</Id>
<Other>group</Other>
</MoreDetails>
</Group>
<Group value="2">
<Header>
<Id>2</Id>
<Other>How</Other>
</Header>
<Detail>
<Id>2</Id>
<Other>to</Other>
</Detail>
<MoreDetails>
<Id>2</Id>
<Other>group</Other>
</MoreDetails>
<MoreDetails>
<Id>2</Id>
<Other>with multiple child</Other>
</MoreDetails>
</Group>
</File>
1.
怎么
1.
到
1.
组
2.
怎么
2.
到
2.
组
2.
有多个孩子
我是这样开始的
<xsl:template match="/File">
<xsl:for-each-group select="./child::*" group-by="Id">
<xsl:variable name="ID" select="Id"/>
<xsl:value-of select="current-grouping-key()"/>
和使用变量和键名的变体,但我无法按指定输出
欢迎提出任何意见。
提前谢谢
-ac您需要使用
current-group()
访问组中的节点
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="/File">
<File>
<xsl:for-each-group select="./child::*" group-by="Id">
<Group value="{Id}">
<xsl:copy-of select="current-group()"/>
</Group>
</xsl:for-each-group>
</File>
</xsl:template>
</xsl:stylesheet>
您需要使用
current-group()
访问组中的节点
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="/File">
<File>
<xsl:for-each-group select="./child::*" group-by="Id">
<Group value="{Id}">
<xsl:copy-of select="current-group()"/>
</Group>
</xsl:for-each-group>
</File>
</xsl:template>
</xsl:stylesheet>
效果很好。我所拥有的最接近的节点是(下图),但最后一个节点的形式不正确。感谢您提供的完美解决方案。啊,无法发布我的xsl。。无论如何,你的更好。再次感谢。这很有效。我所拥有的最接近的节点是(下图),但最后一个节点的形式不正确。感谢您提供的完美解决方案。啊,无法发布我的xsl。。无论如何,你的更好。再次感谢。