XSL: проблема с str: split для каждого - PullRequest
0 голосов
/ 02 декабря 2011

Заявитель: данные не являются реальными, все данные являются фиктивными, включая теги, но логика реальна.

Файл XML

<MasterData>
<data>
    <document type="1"> <!-- Document 1 -->
        <configuration>
            <attribute_info>
                <attribute>Value similar to Document 2
                </attribute>
                <attribute>Value similar to Document 2
                </attribute>
            </attribute_info>
        </configuration>
        <Model>
            <Name>Products</Name>
            <ModelType>T1</ModelType>
        </Model>
    </document>
    <document type="2"> <!-- Document 2 -->
        <configuration>
            <attribute_info>
                <attribute name="shift" value="6$,$7$,$8$,$9$,$$,$$,$$,$" label="shift">6$,$7$,$8$,$9$,$$,$$,$$,$</attribute>
                <attribute name="serviceType" value="Replace$,$Standard Replace$,$Specific Replace$,$Bar Replace$,$Bar & Plate Replace$,$Bush Replace$,$Bush Replace - Standard$,$Bush Replace - Specific" label="serviceType">Replace$,$Standard Replace$,$Specific Replace$,$Bar Replace$,$Bar & Plate Replace$,$Bush Replace$,$Bush Replace - Standard$,$Bush Replace - Specific</attribute>
                <attribute name="hrs" value="1$,$2$,$2.5$,$4$,$1$,$2$,$6$,$6" label="hrs">1$,$2$,$2.5$,$4$,$1$,$2$,$6$,$6</attribute>
            </attribute_info>
        </configuration>
        <Model>
            <Name>Service</Name>
            <ModelType>T2</ModelType>
        </Model>
    </document>
    <document type="2"> <!-- Document 3 -->
        <configuration>
            <attribute_info>
                <attribute>Value similar to Document 2
                </attribute>
                <attribute>Value similar to Document 2
                </attribute>
            </attribute_info>
        </configuration>
        <Model>
            <Name>Service</Name>
            <ModelType>T2</ModelType>
        </Model>
    </document>
</data></MasterData>

Файл XSL

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:str="http://exslt.org/strings">
<xsl:template match="/">
    <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
        <Worksheet ss:Name="Excel Output Doc Mockup">
            <Table ss:ExpandedColumnCount="100" ss:ExpandedRowCount="600" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="42" ss:DefaultRowHeight="11.25">
                <xsl:for-each select="/MasterData/data/document[(normalize-space(./@type)='2') and (normalize-space(./Model/Name)='Service' and normalize-space(./Model/ModelType)='T2')]">

                    <xsl:variable name="shift" select="str:split(./configuration/attribute_info/attribute[@name='shift'],'$,$')" />
                    <xsl:variable name="hrs" select="str:split(./configuration/attribute_info/attribute[@name='hrs'],'$,$')" />

                    <xsl:for-each select="str:split(./configuration/attribute_info/attribute[@name='serviceType'],'$,$')">
                        <Row ss:AutoFitHeight="0">
                            <Cell ss:Index="1">
                                <Data ss:Type="String">
                                    <xsl:value-of select="." />
                                </Data>
                            </Cell>
                            <Cell ss:Index="2">
                                <Data ss:Type="String">
                                    <xsl:value-of select="$shift[position()]"/>
                                </Data>
                            </Cell>
                            <Cell ss:Index="3">
                                <Data ss:Type="String">
                                    <xsl:value-of select="$hrs[position()]" />
                                </Data>
                            </Cell>
                        </Row>
                    </xsl:for-each>

                </xsl:for-each>
            </table>
        </Worksheet>
    </Workbook>
</xsl:template></xsl:stylesheet>

Ожидаемый результат в книге / листе Excel

Столбец1 Столбец2 Столбец3

Заменить 6 1

Стандартный Заменить 7 2

Определить Заменить 82.5

Замена бара 9 4

Замена стержня и пластины 1

Замена втулки 2

Замена втулки - стандарт 6

Замена втулки- Конкретный 6


Но я получаю результат как

Столбец1 Столбец2 Столбец3

Заменить 1 2

Стандартный Заменить 2,5 4

Специальная замена 1 2

Замена бара 6 6

Замена стержня и пластины

Замена втулки

Замена втулки - стандарт

Bush Replace - Specific

Кажется, что я получаю значения самой последней разделенной строки, хотя я ссылаюсь на соответствующие разделенные строки, используя их resпеременные.

1 Ответ

2 голосов
/ 02 декабря 2011

Вместо :

<xsl:value-of select="$shift[position()]"/> 

У

<xsl:value-of select="$shift[$vPos+0]"/>  

и $vPos определены сразу после xsl:for-each:

<xsl:for-each select=
  "str:split(./configuration/attribute_info/attribute[@name='serviceType'],'$,$')">

  <xsl:variable name="vPos" select="position()"/>  

Помните : Функция position() является контекстно-зависимой.

Его значение в;

<xsl:value-of select="$shift[position()]"/> 

- это , а не позиция current() в текущем списке узлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...