代码之家  ›  专栏  ›  技术社区  ›  Jkoul

元素更改时重置XSLT增量

  •  1
  • Jkoul  · 技术社区  · 7 年前

    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>
    

    当我有现有的Activity和OBJECTID时,前两个When子句可以正常工作。当不存在 ObjectID或ObjectID在第3次更改时。我需要的是从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>
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   daniu    7 年前

    我认为您想要的是为每个活动分配一个值,所以这就是您想要匹配的

    <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的索引。