XSLT按元素的属性和位置分组



我正在尝试使用XSLT转换数据,将元素名称用作属性,然后按其分组。我还需要根据元素的出现重置位置值。我不知道在为每个元素执行时如何按元素名称分组请求:

<SOH>
<SOH3_4>
<DIE>A</DIE>
<NAMDIE>string</NAMDIE>
<CCE>string</CCE>
</SOH3_4>
<SOH3_4>
<DIE>AB</DIE>
<NAMDIE>string</NAMDIE>
<CCE>string</CCE>
</SOH3_4>
<SOH3_5>
<SHO>string</SHO>
<INVDTAAMT>1873960.2349058</INVDTAAMT>
<INVDTATYP>03:ENG:%</INVDTATYP>
<SFISSTCOD>string</SFISSTCOD>
</SOH3_5>
<SOH3_5>
<SHO>string</SHO>
<INVDTAAMT>2280630.2349058</INVDTAAMT>
<INVDTATYP>01:ENG:Tax excluded</INVDTATYP>
<SFISSTCOD>string</SFISSTCOD>
</SOH3_5>

结果:

<PARAM>
<TAB ID="SOH3_4">
<LIN ID="1">
<FLD NAME="DIE">A</FLD>
<FLD NAME="NAMDIE">string</FLD>
<FLD NAME="CCE">string</FLD>

</LIN>
<LIN ID="2">
<FLD NAME="DIE">AB</FLD>
<FLD NAME="NAMDIE">string</FLD>
<FLD NAME="CCE">string</FLD>
</LIN>
</TAB>
<TAB ID="SOH3_5">
<LIN ID="1">
<FLD NAME="SHO">string</FLD>
<FLD NAME="INVDTAAMT">1873960.2349058</FLD>
<FLD NAME="INVDTATYP">03:ENG:%</FLD>
<FLD NAME="INVDTAAMT">string</FLD>
</LIN>
<LIN ID="2">
<FLD NAME="SHO">string</FLD>
<FLD NAME="INVDTAAMT">2280630.2349058</FLD>
<FLD NAME="INVDTATYP">01:ENG:Tax excluded</FLD>
<FLD NAME="SFISSTCOD">string</FLD>
</LIN>
</TAB>

您的编辑建议您可以从使用XSLT2或3和for-each-group select="*" group-adjacent="node-name()"中获益,例如在XSLT3中(支持SaxonJS2、Saxon9.8 HE或更高版本、SaxonC、SaxonCS、AltovaXML 2017 R3及更高版本(,它可以归结为:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes"
version="3.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="SOH">
<PARAM>
<xsl:for-each-group select="*" group-adjacent="node-name()">
<TAB ID="{current-grouping-key()}">
<xsl:apply-templates select="current-group()"/>
</TAB>
</xsl:for-each-group>
</PARAM>
</xsl:template>

<xsl:template match="SOH/*">
<LIN ID="{position()}">
<xsl:apply-templates/>
</LIN>
</xsl:template>

<xsl:template match="SOH/*/*">
<FLD NAME="{local-name()}">{.}</FLD>
</xsl:template>

</xsl:stylesheet>

您的问题有点不清楚排序顺序,但您可以使用以下模板来获得所需的输出:

<xsl:template match="SOH">
<xsl:element name="TAB">
<xsl:attribute name="ID"><xsl:value-of select="name(*[1])" /></xsl:attribute>
<xsl:for-each select="*">
<LIN ID="{position()}">
<xsl:for-each select="*">
<xsl:element name="FLD">
<xsl:attribute name="NAME"><xsl:value-of select="name()" /></xsl:attribute>
<xsl:value-of select="." />
</xsl:element>
</xsl:for-each>
</LIN>
</xsl:for-each>
</xsl:element>
</xsl:template>

输出符合要求的

<TAB ID="SOH3_5">
<LIN ID="1">
<FLD NAME="SHO">string</FLD>
<FLD NAME="INVDTAAMT">1873960.2349058</FLD>
<FLD NAME="INVDTATYP">03:ENG:%</FLD>
<FLD NAME="SFISSTCOD">string</FLD>
</LIN>
<LIN ID="2">
<FLD NAME="SHO">string</FLD>
<FLD NAME="INVDTAAMT">2280630.2349058</FLD>
<FLD NAME="INVDTATYP">01:ENG:Tax excluded</FLD>
<FLD NAME="SFISSTCOD">string</FLD>
</LIN>
</TAB>

最新更新