Расчет различий с использованием XSLT - PullRequest
3 голосов
/ 20 февраля 2012

Я пытаюсь извлечь некоторую информацию из файла XML с помощью xslt. Я использовал математические функции 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 ]

1 голос
/ 20 февраля 2012

Это короткое и простое преобразование (без 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
1 голос
/ 20 февраля 2012

Использование:

<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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...