使用XSLT计算差异

时间:2012-02-20 16:56:28

标签: xml xslt xpath

我正在尝试使用xslt从xml文件中提取一些信息。我已经使用xslt数学函数来输出我正在迭代的一些动作的开始和结束时间之间的差异。但是,我不确定如何扩展它以计算下一个动作的开始时间和前一个动作的结束时间之间的差异。据我所知,你无法在xslt中重新分配变量。在传统语言中,我只是将最后一次遇到的变量存储起来。如果有人能以更惯用的xslt方式给我一些关于如何做到这一点的指示,我将非常感激。

这是我的数据文件的简化版本。

<Actions>
    <Action>
            <Start>1</Start>
            <End>10</End>
    </Action>
    <Action>
            <Start>13</Start>
            <End>16</End>
    </Action>
    <Action>
            <Start>20</Start>
            <End>24</End>
    </Action>
</Actions>

这是我当前的xslt转换,它只会在内部对操作产生影响。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="text" indent="yes" omit-xml-declaration="yes" />
<xsl:template match="/">
    <xsl:for-each select="Actions/Action">
        <xsl:value-of select="End - Start" /><xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

我希望看到的结果是

9
3
3
4
4

2 个答案:

答案 0 :(得分:1)

使用:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/Actions/Action">
    <xsl:value-of select="End - Start"/>
    <xsl:if test="following-sibling::Action">
      <xsl:text>&#xA;</xsl:text>
      <xsl:value-of select="following-sibling::Action/Start - End"/>
      <xsl:text>&#xA;</xsl:text>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

输出:

9
3
3
4
4

答案 1 :(得分:1)

这个简短而简单的转换(没有xsl:if,没有轴):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:variable name="vValues" select="/*/*/*"/>

 <xsl:template match="/">
     <xsl:for-each select="$vValues[position() >1]">
       <xsl:variable name="vPos" select="position()"/>

       <xsl:value-of select=". - $vValues[$vPos]"/>
       <xsl:text>&#xA;</xsl:text>
     </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<Actions>
    <Action>
        <Start>1</Start>
        <End>10</End>
    </Action>
    <Action>
        <Start>13</Start>
        <End>16</End>
    </Action>
    <Action>
        <Start>20</Start>
        <End>24</End>
    </Action>
</Actions>

生成想要的正确结果

9
3
3
4
4