Đây là giải pháp sử dụng XSLT2, trong đó tập hợp nút là đối tượng hạng nhất. Trong XSLT1, bạn cần sử dụng phần mở rộng tập hợp nút.
Giải thích dưới đây:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:variable name="extendedItems" as="xs:integer*">
<xsl:for-each select="//Item">
<xsl:value-of select="./Price * ./Quantity"/>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="total">
<xsl:value-of select="sum($extendedItems)"/>
</xsl:variable>
<xsl:template match="//QuantityTotal">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:value-of select="$total"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Cách tiếp cận ở đây là sử dụng một "Identity chuyển hóa" để sao chép các tài liệu, trong khi thực hiện các tính toán và chèn kết quả vào đầu ra QuantityTotal mẫu. Mẫu đầu tiên sao chép đầu vào vào đầu ra nhưng bị ghi đè bởi một mẫu cụ thể hơn cho QuantityTotal ở dưới cùng. Khai báo biến đầu tiên tạo ra một danh sách các chi phí mở rộng, và định nghĩa biến thứ hai tính tổng chi phí để tạo ra tổng số. Tổng số sau đó được chèn vào nút QuantityTotal.
Chìa khóa để hiểu XSL là nó mang tính khai báo trong tự nhiên. Lỗi khái niệm phổ biến nhất được thực hiện bởi hầu hết tất cả người mới bắt đầu là giả định rằng biểu định kiểu là một chương trình tuần tự xử lý tài liệu XML đầu vào. Trong thực tế, đó là cách khác xung quanh. Công cụ XSL đọc tài liệu XML. và đối với mỗi thẻ mới, nó gặp trong biểu định kiểu cho đối sánh "tốt nhất", thực thi mẫu đó.
EDIT:
Dưới đây là một phiên bản xslt1.1 làm việc với Saxon 6,5
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ex="http://exslt.org/common"
extension-element-prefixes="ex"
version="1.1">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:variable name="extendedItems">
<xsl:for-each select="//Item">
<extended>
<xsl:value-of select="./Price * ./Quantity"/>
</extended>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="total">
<xsl:value-of select="sum(ex:node-set($extendedItems/extended))"/>
</xsl:variable>
<xsl:template match="//QuantityTotal">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:value-of select="$total"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Nguồn
2010-08-27 01:42:59
+1 câu hỏi hay –
Câu hỏi hay (+1). Xem câu trả lời của tôi cho các giải pháp trong cả XSLT 1.0 (không yêu cầu mở rộng) và XSLT 2.0 –
Xem thêm http://stackoverflow.com/questions/436998/multiply-2-numbers-and-then-sum-with-xslt và http : // stackoverflow.com/questions/1333558/xslt-to-sum-product-of-two-attributes – harpo