使用 XSLT 计算差异

发布于 2025-01-07 12:42:19 字数 1277 浏览 0 评论 0原文

我正在尝试使用 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

I'm trying to extract some information from an xml file using xslt. I've used the xslt math functions to output the differences between start and end times of some actions that I'm iterating over. However, I'm not certain how I can extend this to work out the difference between the start time of the next action and end time of the previous one. As far as I was aware you can't reassign a variable in xslt. In a conventional language I'd just store the last time encountered as variable. If anyone that could give me some pointers on how to do this in a more idiomatic xslt way I'd be most grateful.

Here's a simplified version of my data file.

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

This is my current xslt transformation that just does difference internally on actions.

<?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>
</xsl:text>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

The result I'd like to see is

9
3
3
4
4

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

森林散布 2025-01-14 12:42:19

这个简短的转换(没有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>
</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

This short and simple transformation (no xsl:if, no axes):

<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>
</xsl:text>
     </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

when applied on the provided XML document:

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

produces the wanted, correct result:

9
3
3
4
4
扬花落满肩 2025-01-14 12:42:19

用途:

<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>
</xsl:text>
      <xsl:value-of select="following-sibling::Action/Start - End"/>
      <xsl:text>
</xsl:text>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

输出:

9
3
3
4
4

Use:

<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>
</xsl:text>
      <xsl:value-of select="following-sibling::Action/Start - End"/>
      <xsl:text>
</xsl:text>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

Output:

9
3
3
4
4
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文