gpt4 book ai didi

xslt - 使用 xslt 和子节点进行分组

转载 作者:行者123 更新时间:2023-12-04 18:12:19 26 4
gpt4 key购买 nike

我在这里尝试了一些示例,但仍然无法获得正确的输出。我以前没有用过 XSLT。我想对“Detail”元素进行分组,并将所有与该组匹配的“Data”元素作为“Detail”元素的子元素。

例子:

输入

<?xml version="1.0" encoding="utf-8"?>
<File>
<Detail type="A" group="1" >
<Data>
<Nr>1</Nr>
</Data>
<Data>
<Nr>2</Nr>
</Data>
</Detail>
<Detail type="B" group="1">
<Data>
<Nr>3</Nr>
</Data>
<Data>
<Nr>4</Nr>
</Data>
</Detail>
<Detail type="B" group="2">
<Data>
<Nr>5</Nr>
</Data>
</Detail>
<Detail type="A" group="1">
<Data>
<Nr>6</Nr>
</Data>
</Detail>
</File>

想要的输出(“Detail type="A"group="1"> 元素组合在一起,并且所有与该组匹配的元素作为子元素)
<?xml version="1.0" encoding="utf-8"?>
<File>
<Detail type="A" group="1" >
<Data>
<Nr>1</Nr>
</Data>
<Data>
<Nr>2</Nr>
</Data>
<Data>
<Nr>6</Nr>
</Data>
</Detail>
<Detail type="B" group="1">
<Data>
<Nr>3</Nr>
</Data>
<Data>
<Nr>4</Nr>
</Data>
</Detail>
<Detail type="B" group="2">
<Data>
<Nr>5</Nr>
</Data>
</Detail>
</File>

感谢帮助 :)

最佳答案

一、XSLT 1.0

这是一个使用面向推送的模板的解决方案,而不是 <xsl:for-each> (这通常是一种更可重用的方法)。

当此 XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:key name="kDetailAttr" match="Detail" use="concat(@type, '+', @group)" />

<xsl:template match="/*">
<File>
<xsl:apply-templates select="Detail[generate-id() = generate-id(key('kDetailAttr', concat(@type, '+', @group))[1])]" />
</File>
</xsl:template>

<xsl:template match="Detail">
<Detail type="{@type}" group="{@group}">
<xsl:copy-of select="key('kDetailAttr', concat(@type, '+', @group))/Data" />
</Detail>
</xsl:template>

</xsl:stylesheet>

...应用于原始 XML:
<?xml version="1.0" encoding="UTF-8"?>
<File>
<Detail type="A" group="1">
<Data>
<Nr>1</Nr>
</Data>
<Data>
<Nr>2</Nr>
</Data>
</Detail>
<Detail type="B" group="1">
<Data>
<Nr>3</Nr>
</Data>
<Data>
<Nr>4</Nr>
</Data>
</Detail>
<Detail type="B" group="2">
<Data>
<Nr>5</Nr>
</Data>
</Detail>
<Detail type="A" group="1">
<Data>
<Nr>6</Nr>
</Data>
</Detail>
</File>

...产生了想要的结果:
<?xml version="1.0" encoding="utf-8"?>
<File>
<Detail type="A" group="1">
<Data>
<Nr>1</Nr>
</Data>
<Data>
<Nr>2</Nr>
</Data>
<Data>
<Nr>6</Nr>
</Data>
</Detail>
<Detail type="B" group="1">
<Data>
<Nr>3</Nr>
</Data>
<Data>
<Nr>4</Nr>
</Data>
</Detail>
<Detail type="B" group="2">
<Data>
<Nr>5</Nr>
</Data>
</Detail>
</File>

解释:
  • 通过正确应用 Muenchian Grouping Method (这在 XSLT 1.0 中是必需的,因为它没有任何“内联”分组机制),我们可以找到唯一节点并将它们的后代分组。


  • 二、 XSLT 2.0

    当此 XSLT:
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:output omit-xml-declaration="no" indent="yes" />
    <xsl:strip-space elements="*" />

    <xsl:template match="/*">
    <File>
    <xsl:for-each-group select="Detail"
    group-by="concat(@type, '+', @group)">
    <Detail type="{@type}" group="{@group}">
    <xsl:copy-of select="current-group()/Data" />
    </Detail>
    </xsl:for-each-group>
    </File>
    </xsl:template>
    </xsl:stylesheet>

    ...应用于原始 XML,产生相同的正确结果。

    解释:
  • 通过正确应用 XSLT 2.0 的 for-each-group 元素,我们可以得到相同的结果。
  • 关于xslt - 使用 xslt 和子节点进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12374327/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com