更改来自不同节点的相同值

时间:2018-11-27 18:17:28

标签: xslt-2.0

我需要在同一个兄弟姐妹中定位值。如果它们相同,则需要更改它们。

我认为我需要以某种方式使用后继和前继以及分组方式。首先按要查找的值分组,以便获得彼此位置相同的值。然后使用同级函数找出它们是否相等。

示例:

<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

1 个答案:

答案 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>

请参见http://xsltransform.hikmatu.com/6qVRKvJ