首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xslt -添加Lp。目标节点

xslt -添加Lp。目标节点
EN

Stack Overflow用户
提问于 2015-05-11 23:15:25
回答 2查看 55关注 0票数 0

我是xslt新手,所以在向转换中添加Lp时遇到了一些问题。

这是我的简单xml数据:

代码语言:javascript
复制
 <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,我需要输出文本文件如下所示:

代码语言:javascript
复制
ID;VN,LP
ww1;108;1
ww2;108;2
ww3;108;3
ww4;109;1
ww5;109;2
ww6;110;1

我在voucherNumber上添加了密钥

代码语言:javascript
复制
<xsl:key name="x" match="booking" use="voucherNumber"/>

在for-each语句中,我添加了以下代码:它在最后一个位置添加我(我知道我可以为另一个位置更改此位置)同一个voucherNumber的计数我的项目的数量,但我如何为其他项目添加数字Lp?

代码语言:javascript
复制
<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样式表。谢谢你的建议,致以最诚挚的问候

EN

回答 2

Stack Overflow用户

发布于 2015-05-12 00:00:01

我不知道"Lp“是什么意思。假设您想要按顺序对预订进行编号,并在voucherNumber上重新启动,请尝试执行以下操作:

--编辑--

这里的正确解决方案是使用<xsl:number>对节点进行编号。但是,由于我找不到可以在所有XSLT 1.0处理程序中以相同方式工作的单一属性组合,因此我采用了以下技巧:

代码语言:javascript
复制
<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>
票数 1
EN

Stack Overflow用户

发布于 2015-05-12 00:20:39

这里看起来像是在尝试使用Muenchian分组,但是您可能应该从选择每个不同voucherNumber第一次出现的booking元素开始

代码语言:javascript
复制
<xsl:for-each select="booking[generate-id() = generate-id(key('x',voucherNumber)[1])]">

然后,您就有了一个嵌套的xsl:for-each,您可以在其中获取该组中的所有booking元素(即具有相同voucherNumberbooking元素)。

代码语言:javascript
复制
<xsl:for-each select="key('x', voucherNumber)">

然后,在下一个xsl:for-each中,您可以使用position()函数来获取该特定组中记录的计数

试试这个XSLT

代码语言:javascript
复制
<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元素。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30171441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档