XSLT 1.0 中的分组 - 具有内部和外部元素的数组
Grouping in XSLT 1.0 - Array with Inside and outside elements
我正在尝试在下面 XML 上应用分组逻辑。这对我来说有点棘手,因为它指的是数组中的内部和外部元素,并且分组是在数组内部形式的代码上完成的。我已经提供了我尝试过的方法,但它没有效果,因为它没有给我想要的输出。请建议我如何分组。
- 要对输入数组中存在的类别代码 I 和 F 进行分组。
- 输出中的内部数组再次引用输入中数组外部的 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
前缀相同的名称空间,因此差异纯粹是装饰性的。
我正在尝试在下面 XML 上应用分组逻辑。这对我来说有点棘手,因为它指的是数组中的内部和外部元素,并且分组是在数组内部形式的代码上完成的。我已经提供了我尝试过的方法,但它没有效果,因为它没有给我想要的输出。请建议我如何分组。
- 要对输入数组中存在的类别代码 I 和 F 进行分组。
- 输出中的内部数组再次引用输入中数组外部的 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
前缀相同的名称空间,因此差异纯粹是装饰性的。