我試圖將一個無所不包的xsl樣式表更改爲兩階段樣式表設置,其中第一步將xml轉換爲「理想」xml,第二步步驟僅僅是格式化。如何使用XSL轉換管道或兩階段轉換
最初,我們有這個XML(多餘的部分去掉)
<?xml-stylesheet type="text/xsl" href="xsl/storeFinancialReport.xsl" ?>
<storeFinancialReport>
<ProductGroupEntry><ProductGroupCode>xz1</ProductGroupCode><ProductGroup>thing1</ProductGroup><Quantity>0.0000</Quantity><DiscountExcl>0.000000</DiscountExcl><SalesExcl>30.700000</SalesExcl><Sales>35.000000</Sales></ProductGroupEntry>
<ProductGroupEntry><ProductGroupCode>xz2</ProductGroupCode><ProductGroup>thing2</ProductGroup><Quantity>13.0000</Quantity><DiscountExcl>0.000000</DiscountExcl><SalesExcl>1480.970000</SalesExcl><Sales>1688.310000</Sales></ProductGroupEntry>
<ProductGroupEntry><ProductGroupCode>xz3</ProductGroupCode><ProductGroup>thing3</ProductGroup><Quantity>2.0000</Quantity><DiscountExcl>0.000000</DiscountExcl><SalesExcl>50.730000</SalesExcl><Sales>57.830000</Sales></ProductGroupEntry>
<ProductGroupEntry><ProductGroupCode>xz4</ProductGroupCode><ProductGroup>thing4</ProductGroup><Quantity>2.0000</Quantity><DiscountExcl>0.000000</DiscountExcl><SalesExcl>40.450000</SalesExcl><Sales>46.110000</Sales></ProductGroupEntry>
<ProductGroupEntry><ProductGroupCode>xz5</ProductGroupCode><ProductGroup>thing5</ProductGroup><Quantity>2.0000</Quantity><DiscountExcl>1.000000</DiscountExcl><SalesExcl>18.000000</SalesExcl><Sales>18.000000</Sales></ProductGroupEntry>
<ProductGroupEntry><ProductGroupCode>xz6</ProductGroupCode><ProductGroup>thing6</ProductGroup><Quantity>4.0000</Quantity><DiscountExcl>10.080000</DiscountExcl><SalesExcl>62.900000</SalesExcl><Sales>68.420000</Sales></ProductGroupEntry>
</storeFinancialReport>
我現在正試圖創建一個單獨的模板,做翻譯,數額,計算等,可以重複使用,然後纔有在主文件的第二個模板中的html格式導入帶有「濃縮/理想化」模板的文件
到目前爲止,我在下面有理論上稱之爲模板,它將執行等等,商店這在一個變量,然後這個新轉換的XML作爲變量傳遞給HTML格式的模板。
主/ HTML格式的文件
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:set="http://exslt.org/sets"
extension-element-prefixes="set">
<xsl:output method="html" version="1.0" encoding="UTF-8"
indent="yes" />
<xsl:include href="scrap_book_enrichment.xsl" />
<!-- call Product Group Block -->
<xsl:template name="ProductGroupBlock">
<xsl:variable name="buildProductGroupResultXml"> <!-- store the results of this template call to this variable -->
<xsl:call-template name="buildProductGroup">
<xsl:with-param name="buildProductGroupResults" select="//storeFinancialReport"/>
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="displayProductGroupResults">
<xsl:with-param name="buildProductGroupResults2" select="$buildProductGroupResultXml" />
</xsl:call-template>
</xsl:template>
<xsl:template name="displayProductGroupResults">
<xsl:param name="buildProductGroupResults2" />
<xsl:for-each select="buildProductGroup">
<tr>
<td>
<xsl:value-of select="/" />
</td>
<td colspan="3">
<xsl:value-of
select="$buildProductGroupResults2/ProductGroupCodeText/text()" />
</td>
<td align="right">
<xsl:value-of
select="$buildProductGroupResults2/ProductGroupQuantityText/text()" />
</td>
<td align="right">
<xsl:value-of
select="$buildProductGroupResults2/ProductGroupDiscountExclText/text()" />
</td>
<td align="right">
<xsl:value-of
select="$buildProductGroupResults2/ProductGroupSalesExclText/text()" />
</td>
<td align="right">
<xsl:value-of
select="$buildProductGroupResults2/ProductGroupSalesText/text()" />
</td>
<td align="right">
<xsl:value-of
select="$buildProductGroupResults2/ProductGroupSalesMinusSalesExclText/text()" />
</td>
<td align="right">
<xsl:value-of
select="$buildProductGroupResults2/ProductGroupSalesExclPercentage/text()" />
</td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
第二個導入文件,創建 「理想」 XML
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:set="http://exslt.org/sets" extension-element-prefixes="set">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template name="buildProductGroup">
<xsl:param name="buildProductGroupResults" />
<xsl:for-each select="set:distinct($buildProductGroupResults/ProductGroupEntry/ProductGroup)">
<xsl:variable name="ProductGroup">
<xsl:value-of select="text()" />
</xsl:variable>
<buildProductGroup>
<ProductGroupCodeText><xsl:value-of select="$buildProductGroupResults/ProductGroup[text()=$ProductGroup]/../ProductGroupCode/text()" /><xsl:text> - </xsl:text><xsl:value-of select="$ProductGroup" /></ProductGroupCodeText>
<ProductGroupQuantityText><xsl:value-of select="format-number(sum($buildProductGroupResults/ProductGroup[text()=$ProductGroup]/../Quantity/text()), '0')" />
</ProductGroupQuantityText>
<ProductGroupDiscountExclText><xsl:value-of
select="format-number(sum($buildProductGroupResults/ProductGroup[text()=$ProductGroup]/../DiscountExcl/text()), '###,##0.00')" />
</ProductGroupDiscountExclText>
<ProductGroupSalesExclText><xsl:value-of
select="format-number(sum($buildProductGroupResults/ProductGroup[text()=$ProductGroup]/../SalesExcl/text()), '###,##0.00')" />
</ProductGroupSalesExclText>
<ProductGroupSalesText><xsl:value-of
select="format-number(sum($buildProductGroupResults/ProductGroup[text()=$ProductGroup]/../Sales/text()), '###,##0.00')" />
</ProductGroupSalesText>
<ProductGroupSalesMinusSalesExclText><xsl:value-of select="format-number(sum($buildProductGroupResults/ProductGroup[text()=$ProductGroup]/../Sales/text()) - sum($buildProductGroupResults/ProductGroup[text()=$ProductGroup]/../SalesExcl/text()),'###,##0.00')" />
</ProductGroupSalesMinusSalesExclText>
<ProductGroupSalesExclPercentage>
<xsl:choose>
<xsl:when test="sum($buildProductGroupResults/ProductGroup[text()=$ProductGroup]/../SalesExcl)=0">
<xsl:text>0.00</xsl:text>
</xsl:when>
<xsl:when test="sum($buildProductGroupResults/ProductGroup[text()=$ProductGroup]/../SalesExcl)!=0">
<xsl:value-of
select="format-number(number(( sum($buildProductGroupResults/ProductGroup[text()=$ProductGroup]/../SalesExcl) div (sum($buildProductGroupResults/SalesExcl))) * 100), '###,##0.00')" />
</xsl:when>
</xsl:choose>
<xsl:text>%</xsl:text>
</ProductGroupSalesExclPercentage>
</buildProductGroup>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我知道這些都是相當矮胖,但我相信我已經儘可能減少它,同時保持它真正的我所需要的。我們有十幾個或更多這樣的部分,但我顯然錯過了實現這一目標的基本步驟。
其目的是爲了「豐富」階段創建一個不同的XML,我所見到的格式xsl處理的「理想」xml。不幸的是,當我在eclipse中通過翻譯器運行這些文件時,它只是將原始xml進行了整理,並刪除了所有格式並將它們拼湊在一塊文本中。可能有幾個想法是我在這裏誤解的,但是一旦我有了這一節,我想其他人將會更容易。
非常感謝
米奇。
[更新日期2013年8月6日]
由於花的時間無法完成這一點,我們將獲得在其他方面的利益,已決定花時間,使我們的報告框架,內在地處理流水線xsls。因此,在一個樣式表中需要此功能不再是一項要求。
你在哪裏運行這個XSLT?在瀏覽器中?我不知道任何支持set的瀏覽器:distinct。 – JLRishe
目前爲了測試目的,我通過Eclipse運行它們,但通常情況下是結束HTML輸出到瀏覽器。 設置:distinct部分不是我添加的東西,它已經在那裏,所以我必須假設它按預期工作。 –
替換模板的一個問題是,在「調用產品組塊」部分中,它使用帶有「select」屬性的xsl:call-template。它應該只有「名稱」屬性。 –