Математика Минус один ребенок от анотера в следующем родительском элементе XSLT 1.0 - PullRequest
0 голосов
/ 10 мая 2019

Мне нужно пройтись по узлам и иметь математические функции на родительских и дочерних узлах.

Я играл с parent :: ancestor :: etc, но не могу получить то, что мне нужно.

Я упростил XML и XSL для этого примера того, что мне нужно. `

<bookstore>
<book>
    <title lang="en">Harry Potter</title>
    <price>29.99</price>
</book>
<book>
    <title lang="en">Learning XML</title>
    <price>39.95</price>
</book>
<book>
    <title lang="en">Lord Of The Rings</title>
    <price>32.99</price>
</book>

Мне нужно, чтобы вывод был в таблице (xsl: fo)

Harry Potter       29.99  29.99
Learning XML       39.95  -9.96
Lord Of The Rings  32.99  -6.96

Так что в основном то, что это показывает, заголовок, цена, сумма (цена текущего узла - цена предыдущего узла) Так что последняя ячейка из ряда 2 (39,95 - 29,99) Строка 3 будет (32,99 - 39,95) У меня есть первые два столбца, но я не знаю, как сделать последний столбец в цикле.

Вот фрагмент таблицы, которую я пытаюсь создать

<xsl:for-each select="/bookstore">
<fo:table-row border-top="0.5pt solid black">
    <fo:table-cell <!--%var-cell-padding%-->>
        <fo:block>
            <xsl:value-of select="title" />
        </fo:block>
    </fo:table-cell>
    <fo:table-cell <!--%var-cell-padding%--> text-align="left">
        <fo:block>
            <xsl:value-of select="price"/>
        </fo:block>
    </fo:table-cell>
    <fo:table-cell <!--%var-cell-padding%--> text-align="center">
        <fo:block>
            <xsl:value-of select="currentprice-previousItemInLoopPrice"/>
        </fo:block>
    </fo:table-cell>
</fo:table-row>

1 Ответ

1 голос
/ 11 мая 2019

Ваши данные, по-видимому, не соответствуют вашим ожиданиям, но вот простой пример со всем остатком XSL FO, необходимым для отображения страницы:

С учетом этого ввода:

<bookstore>
    <book>
        <title lang="en">Harry Potter</title>
        <price>29.99</price>
    </book>
    <book>
        <title lang="en">Learning XML</title>
        <price>39.95</price>
    </book>
    <book>
        <title lang="en">Lord Of The Rings</title>
        <price>32.99</price>
    </book>
</bookstore>

И этот XSL (который является одним из 100 способов сделать это):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">
    <xsl:template match="bookstore">
        <fo:table>
            <xsl:apply-templates/>
        </fo:table>
    </xsl:template>
    <xsl:template match="book">
        <fo:table-row>
            <fo:table-cell>
                <fo:block>
                    <xsl:value-of select="title"/>
                </fo:block>
            </fo:table-cell>
            <fo:table-cell>
                <fo:block>
                    <xsl:value-of select="format-number(price,'#.00')"/>
                </fo:block>
            </fo:table-cell>
            <fo:table-cell>
                <fo:block>
                    <xsl:choose>
                        <xsl:when test="not(preceding-sibling::book)">
                            <xsl:text>0.00</xsl:text>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="format-number(number(price) - number(preceding-sibling::book[1]/price), '#.00')"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </fo:block>
            </fo:table-cell>
        </fo:table-row>
    </xsl:template>
</xsl:stylesheet>

Вывод:

<fo:table xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:table-row><fo:table-cell><fo:block>Harry Potter</fo:block></fo:table-cell><fo:table-cell><fo:block>29.99</fo:block></fo:table-cell><fo:table-cell><fo:block>0.00</fo:block></fo:table-cell></fo:table-row>
<fo:table-row><fo:table-cell><fo:block>Learning XML</fo:block></fo:table-cell><fo:table-cell><fo:block>39.95</fo:block></fo:table-cell><fo:table-cell><fo:block>9.96</fo:block></fo:table-cell></fo:table-row>
<fo:table-row><fo:table-cell><fo:block>Lord Of The Rings</fo:block></fo:table-cell><fo:table-cell><fo:block>32.99</fo:block></fo:table-cell><fo:table-cell><fo:block>-6.96</fo:block></fo:table-cell></fo:table-row>
</fo:table
...