XSLT group-by 基于 ID 值 child
XSLT group-by based on ID value child
我想用多个 header、detail 和 moredetail 节点转换 xml。每个节点都包含键 "ID" 以将它们绑定在一起。
这看起来很简单,但对我不起作用。
从下面开始 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>
使用 Group1、Group2 等或 Group value=1、Group value=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>
我是从这样开始的,
<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>
我想用多个 header、detail 和 moredetail 节点转换 xml。每个节点都包含键 "ID" 以将它们绑定在一起。
这看起来很简单,但对我不起作用。
从下面开始 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>
使用 Group1、Group2 等或 Group value=1、Group value=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>
我是从这样开始的,
<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>