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). Помогите переписать парсер для этого случая. Голову ломаю - а получается либо простыня, либо не пашет(((( |
|