XSLT增量在元素更改时重置

问题描述 投票:0回答:1

XML:

<?xml version="1.0" encoding="utf-8"?>
  <Projects> 
    <Project GUID="K9"> 
    <Name>Range</Name>
    <WBSs>
        <WBS GUID="2">
            <Name>Site</Name>
            <ParentWBS/>
            <ProjectGUID>K9</ProjectGUID>
            <ObjectId>99040</ObjectId>
            <Activities/>
            <WBSs>
                <WBS GUID="1">
                <Name>West</Name>
                <ParentWBS>2</ParentWBS>
                <ProjectGUID>K9</ProjectGUID>
                <ObjectId>99046</ObjectId>
                <Activities>
                  <Activity GUID="A100">
                    <Name>Task</Name>
                    <ProjectGUID>K17</ProjectGUID>
                    <WBSCode>1</WBSCode>
                  </Activity>
                </Activities>
             </WBS>
             <WBS GUID="2">
                 <Name>South</Name>
                 <ParentWBS>2</ParentWBS>
                 <ProjectGUID>K9</ProjectGUID>
                 <ObjectId>99047</ObjectId>
                 <Activities>
                   <Activity GUID="A200">
                     <Name>Task 2</Name>
                   </Activity>
                 </Activities>
             </WBS>
             <WBS GUID="3">
                 <Name>North</Name>
                 <ParentWBS>2</ParentWBS>
                 <ProjectGUID>K9</ProjectGUID>
                 <ObjectId>99048</ObjectId>
                 <Activities/>
             </WBS>
          </WBSs>
      </WBS>
    </WBSs>
    <Activities/>
  </Project>
</Projects>

这是我目前的输出:

<OBJECTID>99046</OBJECTID >
<ACTIVITY>0010</ACTIVITY>
<OBJECTID>99047</OBJECTID >
<ACTIVITY>0020</ACTIVITY>

期望的输出:

<OBJECTID>99046</OBJECTID >
<ACTIVITY>0010</ACTIVITY>
<OBJECTID>99047</OBJECTID >
<ACTIVITY>0010</ACTIVITY>

当我有现有的活动和现有的OBJECTID时,前两个WHEN条款工作正常。当第3个WHEN中没有现有的ObjectID或ObjectID更改时,会出现问题。我需要的是从'0010'开始并递增10直到$ ObjectID改变,然后再次从'0010'开始,依此类推。我的背景是程序编程,所以仍然习惯于功能性的做事方式和不改变变量的限制。提前致谢。

这是相关的XSLT代码:

<ACTIVITY> 
<!-- count($ExistingActivity) = 1 -> ObjectId & Activity Id exist, increment $LastObjectIdActivity/ACTIVITY
   count($ExistingObjectId) = 1 -> ObjectId exists, increment $LastObjectId/ACTIVITY  
   count($ExistingObjectId) = 0 -> $ObjectId start at 0010 and keep incrementing until ObjectId change. 
-->
   <xsl:variable name="incr" select="10"/>
     <xsl:choose>
        <xsl:when test="count($ExistingActivity) = 1">      <!-- Exact match of ObjectId & Activity -->
        <!-- Get last existing ObjectId activity -->                        
          <xsl:variable name="temp" select="$LastObjectIdActivity/ACTIVITY"/>                                 
          <xsl:variable name="Oper" select="format-number($temp, '0000')"/>                              
          <xsl:value-of select="$Oper"/>
        </xsl:when>
        <xsl:when test="count($ExistingObjectId) = 1"> <!-- Activity not found, But ObjectId exists-->
        <!-- Get last existing ObjectId activity -->
          <xsl:variable name="temp" select="$LastObjectId/ACTIVITY + $incr"/>                                 
          <xsl:variable name="Oper" select="format-number($temp, '0000')"/>                              
          <xsl:value-of select="$Oper"/>
        </xsl:when>                                                                            
        <xsl:when test="count($ExistingObjectId) = 0">   <!-- No Existing ObjectId -->
          <xsl:variable name="pos" select="(position() * 10)"/>  
          <xsl:variable name="NextOper" select="format-number($pos, '0000')"/>  <!-- Start Activity at 0010 reset on new ObjectId-->
          <xsl:value-of select="$NextOper"/>
          <!-- $NextOper should be incremented by 10 -->                           
        </xsl:when> 
        <xsl:otherwise>
        </xsl:otherwise>                           
     </xsl:choose>                    
</ACTIVITY>
xslt-1.0
1个回答
0
投票

我想你想要的是为每个活动分配一个值,这就是你想要匹配的东西

<xsl:template match="//Activity">
<OBJECTID>
    <xsl:value-of select="../../ObjectId" />
</OBJECTID>
<ACTIVITY>
    <xsl:value-of select="format-number(10 * (count(preceding-sibling::*) +1), '0000') "/>
</ACTIVITY>
</xsl:template>

这将为输入中的每个活动提供OBJECTID / ACTIVITY对。 count表达式评估先前兄弟活动的数量,即基于1的索引。

© www.soinside.com 2019 - 2024. All rights reserved.