2013-11-24 46 views
0

添加元素我有一些變量需要被比較,並且根據它們是否相等需要被添加到陣列中我的最大的問題是使用數組和在XSLT

一個。是一個很好的手段,這是一個很好的手段。

b。我如何將元素添加到數組中

另外我認爲需要很多ifs的權利。

<xsl:variable name="Monday"> 
    <xsl:apply-templates select="./OpeningHours/Monday"/> 
</xsl:variable> 
<xsl:variable name="Tuesday"> 
    <xsl:apply-templates select="OpeningHours/Tuesday"/> 
</xsl:variable> 
<xsl:variable name="Wednesday"> 
    <xsl:apply-templates select="OpeningHours/Wednesday"/> 
</xsl:variable> 
<xsl:variable name="Thursday"> 
    <xsl:apply-templates select="OpeningHours/Thursday"/> 
</xsl:variable> 
<xsl:variable name="Friday"> 
    <xsl:apply-templates select="OpeningHours/Friday"/> 
</xsl:variable> 
<xsl:variable name="Saturday"> 
    <xsl:apply-templates select="OpeningHours/Saturday"/> 
</xsl:variable> 
<xsl:variable name="Sunday"> 
    <xsl:apply-templates select="OpeningHours/Sunday"/> 
</xsl:variable> 

模板應用於數據

<xsl:template match="OpeningHours/*"> 
    <xsl:value-of select="Open + Close"/> 
</xsl:template> 

樣品

<OpeningHours> 
    <Monday> 
     <Open>8.5</Open> 
     <Close>20</Close> 
    </Monday> 
    <Tuesday> 
     <Open>8.5</Open> 
     <Close>20</Close> 
    </Tuesday> 
    <Wednesday> 
     <Open>8.5</Open> 
     <Close>20</Close> 
    </Wednesday> 
    <Friday> 
     <Open>8.5</Open> 
     <Close>22</Close> 
    </Friday> 
    <Saturday> 
     <Open>7</Open> 
     <Close>14</Close> 
    </Saturday> 
</OpeningHours> 

我最終的結果應該是

週一至週三8:30-20:00

星期五8:30-22:00

星期六7:00-14:00

+0

我認爲你需要解決三個問題:a)一個數組類似於一週中的幾天的配置,以正確的順序處理它們並提供輸出中所需的縮寫。這可以通過XSLT 2.0中的節點列表來處理。 b)您需要將相同的開放時間分組。 c)您需要格式化代表開放時間的時間字符串。 –

+0

還有一點評論:你對輸入文件格式有任何影響嗎?如果是這樣的話,我會建議在一週中的每一天廢除特定的標記,並簡單地將這條信息移動到通用標記的屬性,例如''。這使得處理更容易。 –

+0

@MarcusRickert從技術上講,我確實擁有對文件的控制權,但我認爲現在可能最好不要立即更改,因爲提案已經提交。 – Enzero

回答

0

使用XSLT 2.0,我認爲這是for-each-group group-adjacent工作:

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

<xsl:output method="text"/> 

<xsl:template match="OpeningHours"> 
    <xsl:for-each-group select="*" group-adjacent="concat(Open, '|', Close)"> 
    <xsl:value-of select="concat(substring(local-name(), 1, 3), 
           if (current-group()[2]) then concat('-', substring(local-name(current-group()[last()]), 1, 3)) else(), 
           ' ', Open, '-', Close, '&#10;')"/> 
    </xsl:for-each-group> 
</xsl:template> 

</xsl:stylesheet> 

然後,您可以編寫一個函數來格式化Open/Close

+0

我從 獲得了該功能http://stackoverflow.com/questions/11931481/converting-decimal-hours-to-hours-minutes-and-seconds/11936891#11936891 – Enzero

0

下面的XSLT將完成您描述的大部分功能。我相信它可以變得更高效或更好,但它解決了基於開放日期打開哪些日子來組合的問題。

它不會將「8.5」作爲值重新分解爲「08:30」作爲小時格式。

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method='text' indent="yes"/> 

    <xsl:template match="OpeningHours"> 
     <xsl:apply-templates select="*" /> 
    </xsl:template> 

<!-- process if the element is a child of opening hours --> 
    <xsl:template match="OpeningHours/*"> 
     <xsl:choose> 

<!-- If the preceding Open or Close is different, or we are the firs element --> 
      <xsl:when test="Open != preceding-sibling::*/Open or Close != preceding-sibling::*/Close or position()=1"> 

     <!-- print out the first 3 characters of the name of the element --> 
       <xsl:value-of select='substring(local-name(.),1,3)'/> 

      <!-- if the next Open or Close are different --> 
       <xsl:if test="Open != following-sibling::*[1]/Open or Close != following-sibling::*[1]/Close or position()=last()"> 

      <!-- apply templates on "Open" and "Close" elements --> 
        <xsl:apply-templates select="*"/> 
       <xsl:text> 
</xsl:text> 
       </xsl:if> 
      </xsl:when> 

<!-- if the next Open or Close are diffent --> 
      <xsl:when test="Open != following-sibling::*[1]/Open or Close != following-sibling::*[1]/Close"> 

<!-- print a dash --> 
       <xsl:text>-</xsl:text>   

<!-- print 1st 3 leters of the element name *eg; Mon, Tue --> 
       <xsl:value-of select='substring(local-name(.),1,3)'/> 

<!-- Apply templates on "Open" & "Close" elements --> 
       <xsl:apply-templates select="*"/> 
       <xsl:text> 
</xsl:text> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:template> 

<!-- when processing open or close elements, just print the value of the content --> 
    <xsl:template match="Open"> 
     <xsl:value-of select='.'/> 
    </xsl:template> 
    <xsl:template match="Close"> 
     <xsl:text>-</xsl:text> 
     <xsl:value-of select='.'/> 
    </xsl:template> 


<!-- copy any other node/attribute --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:transform> 

希望這有助於

+0

你可以解釋一下這裏發生的一切,因爲我迷失了。 – Enzero

+0

添加評論。 –

+0

與馬丁使用for-each-group相比,這種方法看起來非常繁瑣。 –