【解決方法】如何获得下面 XSLT 中的预期输出


我有以下 xml –

<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>

使用 xslt,我想获得一个像这样的节点
<值>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>

预期产出 –

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

本质上,如果不同的令牌节点,则使用分隔符 | 获取 节点,否则如果相同的令牌节点属性(如示例)则合并并使用 ; 分隔符。 我们如何使用 XSLT 1.0 来实现这一目标?

我尝试过的:

不知道如何开始,我尝试过但没有成功 –

<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>

解决方案1

无法按原样使用 xsl:sort。 看 https://stackoverflow.com/questions/42806139/using-preceding-sibling-with-with-xslsort[^]。

最好的选择是将其排序到另一个 XML 节点集,然后解析它。

下面的方法有点作用。

这增加了一个额外的 | 在最后。 还添加了 Elements 作为 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をコピーしました