xslt 1.0 объединяет два сегмента - PullRequest
0 голосов
/ 12 марта 2019

как объединить два или более сегментов в один сегмент при xslt 1.0?У меня есть два случая.

Случай 1: Если "GRALIFIER" в GRP / TXT совпадает (например, AAA), объедините это в одно.

Правильно:

КВАЛИФЕР: AAA

ТЕКСТ: тест AAA rtetertertret

Case2: То же самое должно быть в GRP / ITEM / TXT (например: LIN)

Правильно:

КВАЛИФЕР: ЛИН

ТЕКСТ: Тест ЛИН sdfsdfsfsf

<?xml version="1.0"?>
<SEEDELFOR>
	<Test/>
	<CNT>
		<TRANSMISSION_DATE></TRANSMISSION_DATE>
		<TRANSMISSION_TIME></TRANSMISSION_TIME>
		<INTERCHANGE_CONTROL_NUMBER></INTERCHANGE_CONTROL_NUMBER>
		<SENDER></SENDER>
		<SENDER_QUALIFIER></SENDER_QUALIFIER>
		<RECEIVER></RECEIVER>
		<RECEIVER_QUALIFIER></RECEIVER_QUALIFIER>
		<SYNTAX_IDENTIFIER></SYNTAX_IDENTIFIER>
		<SYNTAX_VERSION></SYNTAX_VERSION>
		<BGM></BGM>
		<GRP>
			<IDENTIFIER_BY></IDENTIFIER_BY>
			<IDENTIFIER_SU></IDENTIFIER_SU>
			<DATE_4></DATE_4>
			<REF_ON></REF_ON>
			<ADD>
				<QUALIFIER></QUALIFIER>
				<IDENTIFIER></IDENTIFIER>
				<AGENCY_CODE></AGENCY_CODE>
				<CONTACT>
					<QUALIFIER></QUALIFIER>
					<NUMBER></NUMBER>
				</CONTACT>
				<CONTACT>
					<QUALIFIER></QUALIFIER>
					<NUMBER></NUMBER>
				</CONTACT>
				<CONTACT>
					<QUALIFIER></QUALIFIER>
					<NUMBER></NUMBER>
				</CONTACT>
			</ADD>
			<ADD>
				<QUALIFIER></QUALIFIER>
				<IDENTIFIER></IDENTIFIER>
				<AGENCY_CODE></AGENCY_CODE>
			</ADD>
			<TXT>
				<QUALIFIER>AAA</QUALIFIER>
				<TEXT>Test AAA</TEXT>
			</TXT>
			<TXT>
				<QUALIFIER>AAA</QUALIFIER>
				<TEXT>rtetertertret</TEXT>
			</TXT>
			<TRANSPORT_DETAILS>
				<ADDITIONAL_DETAILS>
					<QUALIFIER></QUALIFIER>
					<DETAILS></DETAILS>
				</ADDITIONAL_DETAILS>
			</TRANSPORT_DETAILS>
			<TRANSPORT_DETAILS>
				<ADDITIONAL_DETAILS>
					<QUALIFIER></QUALIFIER>
					<DETAILS></DETAILS>
				</ADDITIONAL_DETAILS>
			</TRANSPORT_DETAILS>
			<TRANSPORT_DETAILS>
				<ADDITIONAL_DETAILS>
					<QUALIFIER></QUALIFIER>
					<DETAILS></DETAILS>
				</ADDITIONAL_DETAILS>
			</TRANSPORT_DETAILS>
			<ITEM>
				<ITEM_NUMBER_SA></ITEM_NUMBER_SA>
				<QUANTITY></QUANTITY>
				<QUANTITY_UNIT></QUANTITY_UNIT>
				<LINE_ITEM_NUMBER>2</LINE_ITEM_NUMBER>
				<TXT>
				<QUALIFIER>LIN</QUALIFIER>
				<TEXT>Test LIN</TEXT>
			</TXT>
			</ITEM>
			<ITEM>
				<ITEM_NUMBER_SA></ITEM_NUMBER_SA>
				<QUANTITY></QUANTITY>
				<QUANTITY_UNIT></QUANTITY_UNIT>
				<LINE_ITEM_NUMBER>1</LINE_ITEM_NUMBER>
				<TXT>
					<QUALIFIER>LIN</QUALIFIER>
					<TEXT>Test LIN</TEXT>
				</TXT>
				<TXT>
					<QUALIFIER>LIN</QUALIFIER>
					<TEXT>sdfsdfsfsf</TEXT>
				</TXT>
			</ITEM>
		</GRP>
	</CNT>
</SEEDELFOR>

Правильный вывод должен быть:

<?xml version="1.0"?>
<SEEDELFOR>
	<Test/>
	<CNT>
		<TRANSMISSION_DATE></TRANSMISSION_DATE>
		<TRANSMISSION_TIME></TRANSMISSION_TIME>
		<INTERCHANGE_CONTROL_NUMBER></INTERCHANGE_CONTROL_NUMBER>
		<SENDER></SENDER>
		<SENDER_QUALIFIER></SENDER_QUALIFIER>
		<RECEIVER></RECEIVER>
		<RECEIVER_QUALIFIER></RECEIVER_QUALIFIER>
		<SYNTAX_IDENTIFIER></SYNTAX_IDENTIFIER>
		<SYNTAX_VERSION></SYNTAX_VERSION>
		<BGM></BGM>
		<GRP>
			<IDENTIFIER_BY></IDENTIFIER_BY>
			<IDENTIFIER_SU></IDENTIFIER_SU>
			<DATE_4></DATE_4>
			<REF_ON></REF_ON>
			<ADD>
				<QUALIFIER></QUALIFIER>
				<IDENTIFIER></IDENTIFIER>
				<AGENCY_CODE></AGENCY_CODE>
				<CONTACT>
					<QUALIFIER></QUALIFIER>
					<NUMBER></NUMBER>
				</CONTACT>
				<CONTACT>
					<QUALIFIER></QUALIFIER>
					<NUMBER></NUMBER>
				</CONTACT>
				<CONTACT>
					<QUALIFIER></QUALIFIER>
					<NUMBER></NUMBER>
				</CONTACT>
			</ADD>
			<ADD>
				<QUALIFIER></QUALIFIER>
				<IDENTIFIER></IDENTIFIER>
				<AGENCY_CODE></AGENCY_CODE>
			</ADD>
			<TXT>
				<QUALIFIER>AAA</QUALIFIER>
				<TEXT>Test AAA rtetertertret</TEXT>
			</TXT>
			<TRANSPORT_DETAILS>
				<ADDITIONAL_DETAILS>
					<QUALIFIER></QUALIFIER>
					<DETAILS></DETAILS>
				</ADDITIONAL_DETAILS>
			</TRANSPORT_DETAILS>
			<TRANSPORT_DETAILS>
				<ADDITIONAL_DETAILS>
					<QUALIFIER></QUALIFIER>
					<DETAILS></DETAILS>
				</ADDITIONAL_DETAILS>
			</TRANSPORT_DETAILS>
			<TRANSPORT_DETAILS>
				<ADDITIONAL_DETAILS>
					<QUALIFIER></QUALIFIER>
					<DETAILS></DETAILS>
				</ADDITIONAL_DETAILS>
			</TRANSPORT_DETAILS>
			<ITEM>
				<ITEM_NUMBER_SA></ITEM_NUMBER_SA>
				<QUANTITY></QUANTITY>
				<QUANTITY_UNIT></QUANTITY_UNIT>
				<LINE_ITEM_NUMBER>2</LINE_ITEM_NUMBER>
				<TXT>
				<QUALIFIER>LIN</QUALIFIER>
				<TEXT>Test LIN</TEXT>
			</TXT>
			</ITEM>
			<ITEM>
				<ITEM_NUMBER_SA></ITEM_NUMBER_SA>
				<QUANTITY></QUANTITY>
				<QUANTITY_UNIT></QUANTITY_UNIT>
				<LINE_ITEM_NUMBER>1</LINE_ITEM_NUMBER>
				<TXT>
					<QUALIFIER>LIN</QUALIFIER>
					<TEXT>Test LIN sdfsdfsfsf</TEXT>
				</TXT>
			</ITEM>
		</GRP>
	</CNT>
</SEEDELFOR>

С наилучшими пожеланиями Джулиан

1 Ответ

1 голос
/ 13 марта 2019

Это может быть достигнуто следующим образом в XSLT 1.0 :

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

<xsl:key name="qualifierKey" match="/SEEDELFOR/CNT/GRP//TXT" use="QUALIFIER" />
<xsl:key name="qualifierTextKey" match="/SEEDELFOR/CNT/GRP//TXT" use="concat(QUALIFIER, '|', TEXT)" />

<xsl:key name="itemTxtKey" match="/SEEDELFOR/CNT/GRP/ITEM/TXT" use="concat(generate-id(parent::*), QUALIFIER, '|', TEXT)" />

<xsl:template match="node() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
</xsl:template>

<xsl:template match="TXT[position() &gt; 1]" />

<xsl:template match="/SEEDELFOR/CNT/GRP/ITEM/TXT[following-sibling::*[1]][generate-id(.) = generate-id(key('itemTxtKey', concat(generate-id(parent::*), QUALIFIER, '|', TEXT))[1])] 
                   | /SEEDELFOR/CNT/GRP/TXT[following-sibling::*[1]][generate-id() = generate-id(key('qualifierKey',QUALIFIER)[1])]">
    <TXT>
        <QUALIFIER>
            <xsl:value-of select="normalize-space(QUALIFIER)" />
        </QUALIFIER>
        <TEXT>
            <xsl:variable name="count" select="count(key('qualifierKey',QUALIFIER)[generate-id() = generate-id(key('qualifierTextKey', concat(QUALIFIER, '|', TEXT))[1])])" />
            <xsl:for-each select="key('qualifierKey',QUALIFIER)[generate-id() = generate-id(key('qualifierTextKey', concat(QUALIFIER, '|', TEXT))[1])]">

                <xsl:value-of select="normalize-space(TEXT)" />
                <xsl:if test="$count != position()"><xsl:value-of select="' '"></xsl:value-of></xsl:if>
            </xsl:for-each>
        </TEXT>
    </TXT>
</xsl:template>

</xsl:stylesheet>

См. Вывод здесь: http://xsltfiddle.liberty -development.net / jyRYYib / 2

...