2012-02-20 4 views
3

xslt를 사용하여 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 

답변

1

이 짧고 간단하게 변환 (더 xsl:if, 아니 축) :

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

가 원하는, 올바른 결과 생산 : 제공된 XML 문서에 적용

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

9 
3 
3 
4 
4 
+0

무엇에 대한 당신의 좋아하는 주제는 성능에 대한 고려입니까? –

+0

@KirillPolishchuk :이 솔루션이 효율적이지 않다는 것을 암시하는 경우 귀하의 주장을 제공해주십시오. 이 솔루션은 매우 효율적이며 스트리밍 (또는 게으른 평가) 모드에서도 수행 될 수 있다고 생각합니다. 최적화를 수행하지 않고'$ vValues ​​[k]'를 평가하기 위해 O (N)을 사용하는 XSLT 프로세서의 경우,'$ vValues'를 모든 값이 형제 요소에 포함 된 다른 문서로 변환 한 다음 각각에 대해 요소에'position()> 1' 출력'을 붙여라. - preceding-sibling :: * [1]'. 이 처리에는 O (N)이 필요합니다. 이 일반적인 솔루션은 다양한 문서 구조에 적용됩니다. –

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