XSLT 1.0 中的分组 - 具有内部和外部元素的数组

Grouping in XSLT 1.0 - Array with Inside and outside elements

我正在尝试在下面 XML 上应用分组逻辑。这对我来说有点棘手,因为它指的是数组中的内部和外部元素,并且分组是在数组内部形式的代码上完成的。我已经提供了我尝试过的方法,但它没有效果,因为它没有给我想要的输出。请建议我如何分组。

  1. 要对输入数组中存在的类别代码 I 和 F 进行分组。
  2. 输出中的内部数组再次引用输入中数组外部的 ID 字段。

预期输出:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:object xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:array name="OPDetails">
<xsl:object>
<xsl:string name="CategoryCode">I</xsl:string>
<xsl:array name="points">
<xsl:object>
<xsl:string name="Id">514355801</xsl:string>
<xsl:string name="TypeCode">ABC</xsl:string>
<xsl:string name="CategoryDescription">INDIVIDUAL</xsl:string>
<xsl:string name="TypeDescription">POCKET</xsl:string>
</xsl:object>
</xsl:array>
<xsl:array name="points">
<xsl:object>
<xsl:string name="Id">514355801</xsl:string>
<xsl:string name="TypeCode">DEF</xsl:string>
<xsl:string name="CategoryDescription">INDIVIDUAL</xsl:string>
<xsl:string name="TypeDescription">BANK</xsl:string>
</xsl:object>
</xsl:array>
</xsl:object>
<xsl:object>
<xsl:string name="CategoryCode">F</xsl:string>
<xsl:array name="points">
<xsl:object>
<xsl:string name="Id">514355801</xsl:string>
<xsl:string name="TypeCode">ABC</xsl:string>
<xsl:string name="CategoryDescription">FAMILY</xsl:string>
<xsl:string name="TypeDescription">POCKET</xsl:string>
</xsl:object>
</xsl:array>
<xsl:array name="points">
<xsl:object>
<xsl:string name="Id">514355801</xsl:string>
<xsl:string name="TypeCode">DEF</xsl:string>
<xsl:string name="CategoryDescription">FAMILY</xsl:string>
<xsl:string name="TypeDescription">BANK</xsl:string>
</xsl:object>
</xsl:array>
</xsl:object>
</xsl:array>
</xsl:object>

输入:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:object xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:string name="Id">514355801</xsl:string>
<xsl:array name="Details">
<xsl:object>
<xsl:string name="CategoryCode">I</xsl:string>
<xsl:string name="CategoryDescription">INDIVIDUAL</xsl:string>
<xsl:string name="TypeCode">ABC</xsl:string>
<xsl:string name="TypeDescription">POCKET</xsl:string>
</xsl:object>
<xsl:object>
<xsl:string name="CategoryCode">I</xsl:string>
<xsl:string name="CategoryDescription">INDIVIDUAL</xsl:string>
<xsl:string name="TypeCode">DEF</xsl:string>
<xsl:string name="TypeDescription">BANK</xsl:string>
</xsl:object>
<xsl:object>
<xsl:string name="CategoryCode">F</xsl:string>
<xsl:string name="CategoryDescription">FAMILY</xsl:string>
<xsl:string name="TypeCode">ABC</xsl:string>
<xsl:string name="TypeDescription">POCKET</xsl:string>
</xsl:object>
<xsl:object>
<xsl:string name="CategoryCode">F</xsl:string>
<xsl:string name="CategoryDescription">FAMILY</xsl:string>
<xsl:string name="TypeCode">DEF</xsl:string>
<xsl:string name="TypeDescription">BANK</xsl:string>
</xsl:object>
</xsl:array>
</xsl:object>

我尝试过的 - XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:object>
<xsl:array name="OPDetails">
<xsl:for-each select="xsl:object/xsl:array[@name='Details']/xsl:object">
<xsl:object>
<xsl:string name="CategoryCode">
<xsl:value-of select="./xsl:string[@name='CategoryCode']" />
</xsl:string>
<xsl:array name="points">
<xsl:object>
<xsl:string name="ID">
<xsl:value-of select="./xsl:object/xsl:string[@name='Id']" />
</xsl:string>
<xsl:string name="TypeCode">
<xsl:value-of select="./xsl:string[@name='TypeCode']" />
</xsl:string>
<xsl:string name="CategoryDescription">
<xsl:value-of select="./xsl:string[@name='CategoryDescription']" />
</xsl:string>
<xsl:string name="TypeDescription">
<xsl:value-of select="./xsl:string[@name='TypeDescription']" />
</xsl:string>
</xsl:object>
</xsl:array>
</xsl:object>
</xsl:for-each>
</xsl:array>
</xsl:object>
</xsl:template>
</xsl:stylesheet>




     

我没有在您的样式表中看到任何分组尝试。如果您仅限于 XSLT 1.0。您应该使用 Muenchian method 对节点进行分组。在您的示例中,它看起来像:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>

<xsl:key name="obj-by-cat" match="xsl:object" use="xsl:string[@name='CategoryCode']" />

<xsl:template match="/xsl:object">
    <xsl:variable name="id" select="xsl:string[@name='Id']" />
    <xsl:copy>
        <axsl:array name="Details">
            <!-- create a group for each distinct category -->
            <xsl:for-each select="xsl:array/xsl:object[count(. | key('obj-by-cat', xsl:string[@name='CategoryCode'])[1]) = 1]">
                <axsl:object>
                    <xsl:copy-of select="xsl:string[@name='CategoryCode']"/>
                    <!-- get items in current category -->
                    <xsl:for-each select="key('obj-by-cat', xsl:string[@name='CategoryCode'])">
                        <axsl:array name="points">
                            <xsl:copy>
                                <xsl:copy-of select="$id"/>
                                <xsl:copy-of select="xsl:string[@name='TypeCode']"/>
                                <xsl:copy-of select="xsl:string[@name='CategoryDescription']"/>
                                <xsl:copy-of select="xsl:string[@name='TypeDescription']"/>
                            </xsl:copy>
                        </axsl:array>
                    </xsl:for-each>
                </axsl:object>
            </xsl:for-each>
        </axsl:array>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

命名空间别名的解释,阅读:
https://www.w3.org/TR/1999/REC-xslt-19991116/#literal-result-element

请注意,结果可能会因您使用的处理器而略有不同。一些处理器将使用 axsl 前缀输出文字结果元素。由于此前缀绑定到与 xsl 前缀相同的名称空间,因此差异纯粹是装饰性的。