数学。在下一个父项 XSLT 1.0 中减去另一个子项
Math. Minus one child from anotehr in the next parent item XSLT 1.0
我需要遍历节点并在父节点和子节点上使用数学函数。
我玩过 parent:: ancestor:: 等,但我无法得到我需要的东西。
我已经针对我需要的这个示例简化了 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>
我需要输出在 table (xsl:fo)
Harry Potter 29.99 29.99
Learning XML 39.95 -9.96
Lord Of The Rings 32.99 -6.96
所以这基本上显示的是
title, price, sum(当前节点价格-上一节点价格)
所以第 2 行的最后一个单元格是 (39.95 - 29.99)
第 3 行是 (32.99 - 39.95)
我有前两列,但我不知道如何在循环中处理最后一列。
这是我正在尝试创建的 table 的片段
<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>
您的数据似乎不符合您的预期,但这是一个简单的示例,其中包含呈现页面所需的所有 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
我需要遍历节点并在父节点和子节点上使用数学函数。
我玩过 parent:: ancestor:: 等,但我无法得到我需要的东西。
我已经针对我需要的这个示例简化了 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>
我需要输出在 table (xsl:fo)
Harry Potter 29.99 29.99 Learning XML 39.95 -9.96 Lord Of The Rings 32.99 -6.96
所以这基本上显示的是 title, price, sum(当前节点价格-上一节点价格) 所以第 2 行的最后一个单元格是 (39.95 - 29.99) 第 3 行是 (32.99 - 39.95) 我有前两列,但我不知道如何在循环中处理最后一列。
这是我正在尝试创建的 table 的片段
<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>
您的数据似乎不符合您的预期,但这是一个简单的示例,其中包含呈现页面所需的所有 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