2015-05-11 7 views
0

Я новичок в xslt, поэтому у меня есть некоторые проблемы с добавлением 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> 

Ключ voucherNumber, мне нужно добавить Лп для того же voucherNumber I'need выходной текстовый файл, чтобы выглядеть следующим образом:

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

для каждого заявления, которое я добавляю этот код: он добавляет меня в последнюю позицию (я знаю, что могу изменить это для другой позиции) количество подсчетов моих элементов для одного и того же номера ваучера, но как я могу добавить число 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. Благодарим вас за советы С уважением

+1

Можете ли вы показать немного больше своего XSLT, пожалуйста? В частности, вы можете показать заявление 'for-each', которое вы упомянули? Благодаря! –

+0

Мои заявления для каждого выглядят следующим образом: kryspin

ответ

1

Я понятия не имею, что такое «Lp». Предполагая, что вы хотите, чтобы сосчитать бронирований последовательно, перезапускается voucherNumber, попробовать что-то вроде:

- Edit -
Правильное решение здесь было бы использовать <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> 
+0

LP это означает единственное число. Это хорошее разрешение, и это работает для меня! Большое спасибо! С уважением – kryspin

+0

@kryspin Если на ваш вопрос ответили, пожалуйста, закройте его, приняв ответ. –

1

Похоже, что вы пытаетесь использовать Muenchian группирование здесь, но то, что вы, вероятно, нужны сделать, это начать с выбраны booking элементов с первым появлением каждого отдельного voucherNumber

<xsl:for-each select="booking[generate-id() = generate-id(key('x',voucherNumber)[1])]"> 

Тогда у вас есть вложенное xsl:for-each, где вы получите все booking элементов в этой группе (Т.е. в booking элементы с одинаковыми voucherNumber)

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

Смежные вопросы