我是xslt新手,所以在向转换中添加Lp时遇到了一些问题。
这是我的简单xml数据:
<booking>
<bookingID>ww1</bookingID>
<voucherNumber>R-108</voucherNumber>
</booking>
<booking>
<bookingID>ww2</bookingID>
<voucherNumber>R-108</voucherNumber>
</booking>
<booking>
<bookingID>ww3</bookingID>
<voucherNumber>R-108</voucherNumber>
</booking>
<booking>
<bookingID>ww4</bookingID>
<voucherNumber>R-109</voucherNumber>
</booking>
<booking>
<bookingID>ww5</bookingID>
<voucherNumber>R-109</voucherNumber>
</booking>
<booking>
<bookingID>ww6</bookingID>
<voucherNumber>R-110</voucherNumber>
</booking>关键是voucherNumber,我需要为相同的voucherNumber添加Lp,我需要输出文本文件如下所示:
ID;VN,LP
ww1;108;1
ww2;108;2
ww3;108;3
ww4;109;1
ww5;109;2
ww6;110;1我在voucherNumber上添加了密钥
<xsl:key name="x" match="booking" use="voucherNumber"/>在for-each语句中,我添加了以下代码:它在最后一个位置添加我(我知道我可以为另一个位置更改此位置)同一个voucherNumber的计数我的项目的数量,但我如何为其他项目添加数字Lp?
<xsl:choose>
<xsl:when test="generate-id(.) =generate-id(key('x',voucherNumber)[last()])">
<xsl:value-of select="count(key('x',voucherNumber)) "/>
</xsl:when>
<xsl:otherwise>
-- need LP for other items --
</xsl:otherwise>
</xsl:choose>我只能使用1.0版的xslt样式表。谢谢你的建议,致以最诚挚的问候
发布于 2015-05-12 00:00:01
我不知道"Lp“是什么意思。假设您想要按顺序对预订进行编号,并在voucherNumber上重新启动,请尝试执行以下操作:
--编辑--
这里的正确解决方案是使用<xsl:number>对节点进行编号。但是,由于我找不到可以在所有XSLT 1.0处理程序中以相同方式工作的单一属性组合,因此我采用了以下技巧:
<xsl:key name="booking-by-voucherNumber" match="booking" use="voucherNumber"/>
<xsl:template match="/root">
<xsl:for-each select="booking">
<!-- get id and voucher number -->
<xsl:variable name="id" select="generate-id()" />
<xsl:for-each select="key('booking-by-voucherNumber', voucherNumber)">
<xsl:if test="generate-id()=$id">
<xsl:value-of select="position()"/>
</xsl:if>
</xsl:for-each>
<!-- new line -->
</xsl:for-each>
</xsl:template>发布于 2015-05-12 00:20:39
这里看起来像是在尝试使用Muenchian分组,但是您可能应该从选择每个不同voucherNumber第一次出现的booking元素开始
<xsl:for-each select="booking[generate-id() = generate-id(key('x',voucherNumber)[1])]">然后,您就有了一个嵌套的xsl:for-each,您可以在其中获取该组中的所有booking元素(即具有相同voucherNumber的booking元素)。
<xsl:for-each select="key('x', voucherNumber)">然后,在下一个xsl:for-each中,您可以使用position()函数来获取该特定组中记录的计数
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" />
<xsl:key name="x" match="booking" use="voucherNumber"/>
<xsl:template match="/*">
<xsl:for-each select="booking[generate-id() =generate-id(key('x',voucherNumber)[1])]">
<xsl:for-each select="key('x', voucherNumber)">
<xsl:value-of select="bookingID" />
<xsl:text>,</xsl:text>
<xsl:value-of select="substring-after(voucherNumber, '-')" />
<xsl:text>,</xsl:text>
<xsl:value-of select="position()" />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>请注意,这里假设您的实际XML是格式良好的,并且只有一个根元素包含所有booking元素。
https://stackoverflow.com/questions/30171441
复制相似问题