2010-02-16 85 views
3

我想知道是否可以先排序某些元素並將它們(已排序)存儲在變量中。我需要引用他們認爲的XSLT,這就是爲什麼我想將它們存儲在一個變量中。如何對元素進行排序並將它們存儲在變量中XSLT

我試圖做到以下幾點,但它似乎沒有工作

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 

<xsl:variable name="deposits"> 
    <xsl:for-each select="/BookingCostings/MultiDeposits"> 
    <xsl:sort select="substring(@DepositDate, 1, 4)" /> 
    <xsl:sort select="substring(@DepositDate, 6, 2)" /> 
    <xsl:sort select="substring(@DepositDate, 9, 2)" /> 
</xsl:for-each> 
</xsl:variable> 

我試圖通過@DepositDate格式的元素進行排序「YYYY-MM-DD」,並將其儲存所有在$deposits變量中。這樣以後,我可以使用$deposits[1]訪問它們。

我將不勝感激任何幫助和提示!

非常感謝!

+0

你的問題表明你可能是試圖解決一個問題一個更大規模走錯了路。 *爲什麼*你想將一個已排序的節點集存儲在一個變量中?你究竟想要做什麼? (「我想將它們作爲'$ deposits [1]'」訪問它們並不是我正在尋找的答案。) – Tomalak 2010-02-16 12:12:18

+0

Tomalak,不幸的是,我正在處理嚴重結構化的XML。有一些必須按順序排列的配置文件,也需要在結果文件的不同部分。沒有確定存款順序的屬性,我決定不依靠這個位置。這就是爲什麼我決定對它們進行分類和存儲的原因,這樣我就可以在需要的時候輕鬆地將所有這些特定分支引用。 希望有道理? – DashaLuna 2010-02-17 09:04:40

+0

是的。有時候就是這樣。思考一箇中介轉型,合理地重構錯誤投入,然後建立你的最終轉變?從長遠來看,這可能是值得的。 – Tomalak 2010-02-17 17:45:13

回答

3

首先,在你的變量聲明,你需要做一些事情來創建新節點。嚴格地說,你並沒有對它們進行排序,而只是按給定順序閱讀它們。我認爲你需要添加一些xsl:copy命令。

<xsl:variable name="deposits"> 
    <xsl:for-each select="/BookingCostings/MultiDeposits"> 
    <xsl:sort select="substring(@DepositDate, 1, 4)" /> 
    <xsl:sort select="substring(@DepositDate, 6, 2)" /> 
    <xsl:sort select="substring(@DepositDate, 9, 2)" /> 
    <xsl:copy-of select=".|@*" /> 
</xsl:for-each> 
</xsl:variable> 

這是創建一個「節點集」,但要訪問它,您需要在XSLT中使用擴展功能。您使用哪一個取決於您使用的XSLT處理器。在我將要提供的例子中,我使用了微軟的一個。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt" version="1.0"> 

然後,訪問節點的變量,你可以做這樣的事情

<xsl:value-of select="ms:node-set($deposits)/MultiDeposits[1]/@DepositDate" /> 

這裏是一個節點集讀了一篇好文章

Xml.com article on Node-Sets

+2

Tim在你的for內部是正確的,如果你想填充變量,你需要輸出一些東西,所以在for-each中使用。然而,變量的類型不是節點集,而是結果樹片段。只有通過調用變量的擴展函數,結果樹片段才能轉換爲可應用XPath的節點集。 – 2010-02-16 12:05:57

+0

謝謝你們!是的,我絕對需要。蒂姆謝謝你的文章,這是有幫助的。 馬丁,你知道任何一個很好的閱讀樹碎片和不同的函數如何在文檔上工作嗎?或者就此而言,有關XSLT的一般信息?我真的很感激它。只是試圖更好地理解它:) – DashaLuna 2010-02-17 09:15:37

0

猜想(沒有開發ENV手):

添加 <xsl:value-of select="." />

收盤前</xsl:for-each>

4
  1. 使用XSLT version 2.0你可以使用perform-sort並告訴你的變量類型爲a使用MultiDeposits序列as keywordas="element(MultiDeposits)+「)
  2. 由於您的數據已經爲yyyy-MM-DD你能避免使用subtring來獲取日期的各個部分,然後直接在現場使用的排序

使用此示例的xml:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<BookingCostings> 
    <MultiDeposits depositDate="2001-10-09">1</MultiDeposits> 
    <MultiDeposits depositDate="1999-10-09">2</MultiDeposits> 
    <MultiDeposits depositDate="2010-08-09">3</MultiDeposits> 
    <MultiDeposits depositDate="2010-07-09">4</MultiDeposits> 
    <MultiDeposits depositDate="1998-01-01">5</MultiDeposits> 
</BookingCostings> 

和使用XSLT版本2。0片:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<html> 
    <body> 

    <xsl:variable name="deposits" as="element(MultiDeposits)+"> 
    <xsl:perform-sort select="BookingCostings/MultiDeposits"> 
    <xsl:sort select="@depositDate"/> 
    </xsl:perform-sort> 
    </xsl:variable> 

    first date:<xsl:value-of select="$deposits[1]/@depositDate"/>, 
    last date:<xsl:value-of select="$deposits[last()]/@depositDate"/> 

    </body> 
</html> 
</xsl:template> 

</xsl:stylesheet> 

的輸出繼電器將是:

first date:1998-01-01, last date:2010-08-09 
+0

謝謝帕特里克。我假設在XSLT 1.0中as =「element(MultiDeposits)+」是不可能的? 不幸的是,我沒有格式爲yyyy-mm-dd的日期。在子串函數之前,我在每個排序語句中使用函數。我沒有提到它簡化代碼。我試圖在排序語句之前將整個日期轉換爲yyyy-mm-dd,但顯然排序指令必須是第一個。所以是的。 謝謝你的迴應:) – DashaLuna 2010-02-17 09:18:50

+0

不幸的是,它只有2.0。 – Patrick 2010-02-17 10:27:29

相關問題