[ad_1]
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
<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
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.
<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>
[ad_2]
コメント