Làm cách nào để nhận được kết quả mong đợi trong XSLT bên dưới

lập trình


Tôi có xml sau –

<Element>
	<Token>Token1</Token>
     <Values>1,2</Values>
</Element>
<Element>
	<Token>Token2</Token>
     <Values>4,5</Values>
</Element>
<Element>
	<Token>Token1</Token>
     <Values>7,8</Values>
</Element>

Và bằng cách sử dụng xslt, tôi muốn nhận được một nút như thế này –
1,2;7,8|4,5

<Element>
	<Token>Token1</Token>
     <Values>1,2</Values>
</Element>
<Element>
	<Token>Token2</Token>
     <Values>4,5</Values>
</Element>
<Element>
	<Token>Token3</Token>
     <Values>7,8</Values>
</Element>

Sản lượng dự kiến ​​-

<Values>1,2|7,8|4,5</Values>

Về cơ bản nếu các nút mã thông báo riêng biệt thì hãy sử dụng dấu phân cách | để lấy nút nếu không thì nếu các thuộc tính nút mã thông báo giống nhau (như ví dụ) thì hợp nhất và sử dụng; dấu phân cách. Làm cách nào để chúng tôi đạt được điều này bằng XSLT 1.0?

Những gì tôi đã thử:

Không biết bắt đầu như thế nào, tôi đã thử cách này nhưng không hiệu quả –

<xsl:for-each select="//Element/Token[not(.=preceding::*)]">

       <xsl:value-of select="//Element/Values"/>
           <xsl:if test="not(position()=last())">|</xsl:if>


            </xsl:for-each>

Giải pháp 1

Không thể sử dụng xsl:sort nguyên trạng. Nhìn thấy https://stackoverflow.com/questions/42806139/using-preceding-sibling-with-with-xslsort[^].

Cách tốt nhất của bạn là sắp xếp nó thành một tập hợp nút XML khác và sau đó phân tích cú pháp nó.

Sau đây hoạt động phần nào.

Điều này bổ sung thêm | cuối cùng. Đồng thời đã thêm Phần tử làm phần tử gốc cho XML.

XML
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html" indent="yes" />

	<xsl:key name="Token" match="Element" use="Token" />

	<xsl:template match="Elements">
		<xsl:apply-templates select="Element[generate-id(.)=generate-id(key('Token',Token)[1])]"/>
	</xsl:template>

	<xsl:template match="Element">
		<xsl:for-each select="key('Token', Token)">
			<xsl:sort select="Token"/>
			<xsl:value-of select="Values"/>
			<xsl:variable name="var1">
				<xsl:value-of select="Token"/>
			</xsl:variable>
			<xsl:variable name="var2">
				<xsl:value-of select="following::Token"/>
			</xsl:variable>
			<xsl:choose>
				<xsl:when test="not($var2='')">
					<xsl:choose>
						<xsl:when test="not(position()=last())">;</xsl:when>
						<xsl:otherwise>|</xsl:otherwise>
					</xsl:choose>
				</xsl:when>
				<xsl:otherwise>|</xsl:otherwise>
			</xsl:choose>
		</xsl:for-each>
	</xsl:template>

</xsl:stylesheet>

コメント

タイトルとURLをコピーしました