我需要在同一个兄弟姐妹中定位值。如果它们相同,则需要更改它们。
我认为我需要以某种方式使用后继和前继以及分组方式。首先按要查找的值分组,以便获得彼此位置相同的值。然后使用同级函数找出它们是否相等。
示例:
<programs>
<event>
<start>2018-11-25T13:55:00</start>
</event>
<event>
<start>2018-11-27T17:00:00</start>
</event>
<event>
<start>2018-11-25T13:55:00</start>
</event>
<event>
<start>2018-11-25T13:55:00</start>
</event>
</programs>
代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="/">
<output>
<xsl:for-each select="/programs/event">
<xsl:variable name="starttime" select="./start"/>
<startOfProgram><xsl:value-of select="$starttime"/></startOfProgram>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
所需结果:
<output>
<startOfProgram>2018-11-25T13:55:00</startOfProgram>
<startOfProgram>2018-11-25T13:56:00</startOfProgram>
<startOfProgram>2018-11-25T13:57:00</startOfProgram>
<startOfProgram>2018-11-27T17:00:00</startOfProgram>
</output>
我知道这是一个漫长的尝试,所以如果有人可以指出正确的方向或帮助我解决部分问题,我将不胜感激。
样本中还有很多其他元素,它们也会带到输出中。如果重要的话,我可以包括各种各样的东西。
Ps。请注意,该值很容易为2018-11-25T18:30:00
,如果有更多相同的值,则需要为2018-11-25T18:30:00
和连续的2018-11-25T18:31:00
。
答案 0 :(得分:0)
显示的结果看起来像是要将值分组为xs:dateTime
个值,然后根据位置将一分钟简单地添加到组中的每一项:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="programs">
<output>
<xsl:for-each-group select="event/start/xs:dateTime(.)" group-by=".">
<xsl:for-each select="current-group()">
<startOfProgram>{. + (position() - 1) * xs:dayTimeDuration('PT1M')}</startOfProgram>
</xsl:for-each>
</xsl:for-each-group>
</output>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/pPqsHUv/1,上面是XSLT 3,但是对于XSLT 2处理器,我认为您只需要将我以前使用的文本值模板更改为xsl:value-of
:
<startOfProgram><xsl:value-of select=". + (position() - 1) * xs:dayTimeDuration('PT1M')"/></startOfProgram>