| ptybn84.07 
 
 
 Зарегистрирован: 15.12.2011
 Сообщения: 1
 Откуда: SPB
 
 | 
			
				|  Добавлено: Чт Дек 15 2011 12:50    Заголовок сообщения: XSLT |   |  
				| 
 |  
				| Существует xml, вытащенный из Экселя, состоящий из повторяющихся полей с равным числом столбцов, но разным числом строк. Если бы число сторк было бы равным(условно 4), то выглядел бы парсер так:
 
  	  | Код: |  	  | <?xml version="1.0" encoding="UTF-8"?>  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="Windows-1251" indent="yes"  />
 <xsl:template match="NewDataSet">
 <root>
 <session title = "{форма[1]/F1}" start="{форма[1]/F5}" end="{форма[1]/F8}" />
 <company title="{форма[2]/F1}" name="{форма[3]/F1}
 {форма[3]/F3}" />
 <generation title = "{форма[4]/F1}" name = "{форма[4]/F3}"  />
 <station name ="{форма[5]/F3}"/>
 <emptyLine name ="{форма[6]}"/>
 <emptyLine name ="{форма[7]}"/>
 <xsl:for-each select="//форма[position() > 12]">
 <xsl:variable name="line" select="position()+12"/>
 <xsl:if test="not(position() >(105-9))">
 <xsl:if test="(position()  mod 4 = 0)">
 <summary        time ="{F1}"     value = "{F4}"        PMIN = "{F5}"      PMINSO = "{F6}"     PMAXSO = "{F7}"     OUT_IVR_VALUE = "{F8}"     OUT_UPSPEED = "{F9}"     OUT_DOWNSPEED = "{F10}"     RD = "{F11}"      OUT_RSV_AVG_PRICE = "{F13}"     OUT_RSV_SELL_VALUE = "{F14}"      OUT_RSV_SELL_PRICE = "{F15}"     OUT_RSV_RD_BUY_VALUE = "{F16}"     OUT_RSV_RD_BUY_PRICE = "{F17}"      OUT_SDD_BUY_VALUE = "{F18}"     OUT_SDD_BUY_PRICE = "{F19}"     OUT_SDD_SELL_VALUE = "{F20}"     OUT_SDD_SELL_PRICE = "{F21}"     />
 </xsl:if>
 <xsl:if test="(position()  mod 4 = 1)">
 <row time ="{//форма[$line+3]/F1}"     OUT_PSTAGE1_PRICE="{F3}"        OUT_PSTAGE1_VALUE = "{F4}"        PMIN = "{F5}"      PMINSO = "{F6}"     PMAXSO = "{F7}"     value8 = "{F8}"      value9 = "{F9}"     value10 = "{F10}"     RD = "{F11}"      OUT_RSV_AVG_PRICE = "{F13}"     OUT_RSV_SELL_VALUE = "{F14}"      OUT_RSV_SELL_PRICE = "{F15}"     OUT_RSV_RD_BUY_VALUE = "{F16}"     OUT_RSV_RD_BUY_PRICE = "{F17}"      OUT_SDD_BUY_VALUE = "{F18}"     OUT_SDD_BUY_PRICE = "{F19}"     OUT_SDD_SELL_VALUE = "{F20}"     OUT_SDD_SELL_PRICE = "{F21}"     value22 = "{F22}"     value23 = "{F23}"     STAGE2_PRICE = "{F24}"     STAGE2_VALUE = "{F25}"     />
 </xsl:if>
 <xsl:if test="(position()  mod 4 = 2)">      <row time ="{//форма[$line+2]/F1}"     OUT_PSTAGE2_PRICE="{F3}"        OUT_PSTAGE2_VALUE = "{F4}"     PMIN = "{F5}"      PMINSO = "{F6}"     PMAXSO = "{F7}"     value8 = "{F8}"      value9 = "{F9}"     value10 = "{F10}"     RD = "{F11}"      OUT_RSV_AVG_PRICE = "{F13}"     OUT_RSV_SELL_VALUE = "{F14}"      OUT_RSV_SELL_PRICE = "{F15}"     OUT_RSV_RD_BUY_VALUE = "{F16}"     OUT_RSV_RD_BUY_PRICE = "{F17}"      OUT_SDD_BUY_VALUE = "{F18}"     OUT_SDD_BUY_PRICE = "{F19}"     OUT_SDD_SELL_VALUE = "{F20}"     OUT_SDD_SELL_PRICE = "{F21}"     value22 = "{F22}"     value23 = "{F23}"     STAGE3_PRICE = "{F24}"     STAGE3_VALUE = "{F25}"     />
 </xsl:if>
 <xsl:if test="(position()  mod 4 = 3)">      <row time ="{//форма[$line+1]/F1}"     OUT_PSTAGE3_PRICE="{F3}"        OUT_PSTAGE3_VALUE = "{F4}"     PMIN = "{F5}"      PMINSO = "{F6}"     PMAXSO = "{F7}"     value8 = "{F8}"      value9 = "{F9}"     value10 = "{F10}"     RD = "{F11}"      OUT_RSV_AVG_PRICE = "{F13}"     OUT_RSV_SELL_VALUE = "{F14}"      OUT_RSV_SELL_PRICE = "{F15}"     OUT_RSV_RD_BUY_VALUE = "{F16}"     OUT_RSV_RD_BUY_PRICE = "{F17}"      OUT_SDD_BUY_VALUE = "{F18}"     OUT_SDD_BUY_PRICE = "{F19}"     OUT_SDD_SELL_VALUE = "{F20}"     OUT_SDD_SELL_PRICE = "{F21}"     value22 = "{F22}"     value23 = "{F23}"     STAGE4_PRICE = "{F24}"     STAGE4_VALUE = "{F25}"     />
 </xsl:if>
 </xsl:if>
 </xsl:for-each>
 </root>
 </xsl:template>
 </xsl:stylesheet>
 | 
 Но число строк может меняться (4 или 5). Помогите переписать парсер для этого случая. Голову ломаю - а получается либо простыня, либо не пашет((((
 |  |