我想用多个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
答案 0 :(得分:2)
您需要使用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>