使用数组并在XSLT中添加元素

时间:2013-11-24 13:28:23

标签: xml arrays xslt xslt-2.0

我有一些需要比较的变量,如果它们相等则需要添加到数组中我最大的问题是

一个。是一个数组,这是一个很好的手段

湾我如何将元素添加到数组

此外,我认为需要很多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

2 个答案:

答案 0 :(得分:0)

下面的XSLT将完成您描述的大部分功能。我相信它可以变得更有效率或更好,但它解决了找出基于open&amp; amp;截止日期。

它不会将“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>

希望这有帮助,

答案 1 :(得分: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