我是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>
关键是凭证,我需要添加同一票价的LP我需要输出文本文件,看起来像这样:
ID;VN,LP
ww1;108;1
ww2;108;2
ww3;108;3
ww4;109;1
ww5;109;2
ww6;110;1
我将钥匙添加在票价上
<xsl:key name="x" match="booking" use="voucherNumber"/>
在for-each语句中,我添加了此代码:它将我添加到最后一个位置(我知道我可以为另一个位置更改它)其他项目的数字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>
我只能使用XSLT样式表的1.0版。感谢您的建议最好的问候
看起来您正在尝试使用Muenchian分组,但是您可能要做的就是从选择的booking
元素开始,并且首次出现每个不同的voucherNumber
<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
元素的单根元素。
我不知道" lp"是什么意思。假设您想依次编号预订,重新启动voucherNumber
,请尝试以下内容:
- 编辑 -
此处的适当解决方案是使用<xsl:number>
编号节点。但是,由于我找不到与所有XSLT 1.0处理器相同的属性组合,因此我求助于以下hack:
<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>