添加LP.到节点



我是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元素(即具有相同voucherNumberbooking元素)

<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>&#10;</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>

相关内容

  • 没有找到相关文章

最新更新