我有一些需要比较的变量,如果它们相等则需要添加到数组中我最大的问题是
一个。是一个数组,这是一个很好的手段
湾我如何将元素添加到数组
此外,我认为需要很多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 :(得分: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, ' ')"/>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
然后,您可以编写一个函数来格式化Open
/ Close
。