Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt XSL-使用条件计算每个循环的迭代次数_Xslt_Foreach_Iteration_Muenchian Grouping - Fatal编程技术网

Xslt XSL-使用条件计算每个循环的迭代次数

Xslt XSL-使用条件计算每个循环的迭代次数,xslt,foreach,iteration,muenchian-grouping,Xslt,Foreach,Iteration,Muenchian Grouping,如何检查程序何时第一次运行语句,以便程序只执行一次操作。它最后一次运行相同的if语句以便只执行一次其他操作是什么时候position()和number不起作用,因为if语句不总是在position()=1上运行。我不能使用模板函数,也不能编写任何XSL函数,因为我使用的是XF designer,这些关键字在那里不能使用 XML 桑尼 德朗格 山姆 马球 - 桑尼 高尔夫球运动 桑尼 高尔夫球运动 山姆 马自达 XSL 您可以在当前同一类型的检查之后添加一个附加过滤器,进一步检查是否没有其他常

如何检查程序何时第一次运行
语句,以便程序只执行一次操作。它最后一次运行相同的if语句以便只执行一次其他操作是什么时候
position()
和number不起作用,因为if语句不总是在position()=1上运行。我不能使用模板函数,也不能编写任何XSL函数,因为我使用的是XF designer,这些关键字在那里不能使用

XML


桑尼
德朗格
山姆
马球
-
桑尼
高尔夫球运动
桑尼
高尔夫球运动
山姆
马自达
XSL


您可以在当前同一类型的检查之后添加一个附加过滤器,进一步检查是否没有其他
常规驾驶员详细信息/VEH

<xsl:for-each select="/ROOT/INSURANCE_ITEMS/VEHICLE/XMLDOC_VEHICLE
 [REGULAR_DRIVER_DETAILS/DRIVER_NAME=$Driver]
 [not(following::REGULAR_DRIVER_DETAILS/VEH = REGULAR_DRIVER_DETAILS/VEH)]">

结果:

你好,山姆你的车是:马球和马兹达赫洛桑尼你的车是:高尔夫

i、 e.桑尼的另一个高尔夫项目被省略了


然而,整个方法看起来确实非常必要。可能是时候换一个新工具了:-)

谢谢,muenchian方法解决了我的问题


使用XML:

<INSURANCE_ITEMS>
    <VEHICLE>
        <XMLDOC_VEHICLE>    
            <VEH>POLO</VEH>
            <REGULAR_DRIVER_DETAILS>
                <DRIVER_NAME>SANNIE</DRIVER_NAME>           
            </REGULAR_DRIVER_DETAILS>
        </XMLDOC_VEHICLE>
        <XMLDOC_VEHICLE>    
        <VEH>HYUNDAI</VEH>
            <REGULAR_DRIVER_DETAILS>
                <DRIVER_NAME>SAREL</DRIVER_NAME>
                </REGULAR_DRIVER_DETAILS>
        </XMLDOC_VEHICLE>
        <XMLDOC_VEHICLE>    
        <VEH>GOLF</VEH>
            <REGULAR_DRIVER_DETAILS>
                <DRIVER_NAME>SAM</DRIVER_NAME>                  
            </REGULAR_DRIVER_DETAILS>
        </XMLDOC_VEHICLE>
        <XMLDOC_VEHICLE>    
        <VEH>MAZDA</VEH>
            <REGULAR_DRIVER_DETAILS>
                <DRIVER_NAME>SAM</DRIVER_NAME>
                </REGULAR_DRIVER_DETAILS>
        </XMLDOC_VEHICLE>
        <XMLDOC_VEHICLE>    
        <VEH>BAKKIE</VEH>
            <REGULAR_DRIVER_DETAILS>
                <DRIVER_NAME>SAREL</DRIVER_NAME>
                </REGULAR_DRIVER_DETAILS>
        </XMLDOC_VEHICLE>
    </VEHICLE>
</INSURANCE_ITEMS>


马球
桑尼
现代
萨雷尔
高尔夫球运动
山姆
马自达
山姆
巴克基
萨雷尔

输出:


我们注意到SAM是不止一辆车的正式驾驶员:高尔夫和马自达;萨雷尔被认为是不止一辆车的正式司机:现代和巴克奇。请记住:您必须提供正确的常规驾驶员的详细信息,这是每个月最常驾驶车辆的个人,因为保费是根据此人的个人资料计算的。

您可以使用哪种版本的XSLT?你是说你的工具根本不允许你定义自己的模板吗?其他需要跳出模板的东西呢?例如,您能够定义密钥吗?我想说的是,这看起来像是一个相当标准的分组问题,可以使用
为每个组
(如果使用XSLT 2.0)或Muenchian方法(如果使用1.0)来解决。谢谢,Muenchian方法工作得非常好。我使用1.0版。我发现在使用XF设计器时,需要在全局XSLT下声明“XSL:KEY”。模板也是这样工作的。我在下面发布了我的最终版本,使用XSLT 1.0,XF Designer:请注意,在使用XF Designer时,应在全局XSLT下声明以下内容:
<xsl:for-each select="/ROOT/INSURANCE_ITEMS/VEHICLE/XMLDOC_VEHICLE
 [REGULAR_DRIVER_DETAILS/DRIVER_NAME=$Driver]
 [not(following::REGULAR_DRIVER_DETAILS/VEH = REGULAR_DRIVER_DETAILS/VEH)]">
<xsl:for-each select="INSURANCE_ITEMS/VEHICLE/XMLDOC_VEHICLE[count(. | key('cars-by-driver', REGULAR_DRIVER_DETAILS/DRIVER_NAME)[1]) = 2 and not(REGULAR_DRIVER_DETAILS/DRIVER_NAME = following-sibling::XMLDOC_VEHICLE/REGULAR_DRIVER_DETAILS/DRIVER_NAME )]">

  <xsl:if test="position() != 1">
    <xsl:value-of select="'; and '"/>
  </xsl:if>
  <xsl:if test="position() = 1">
    <xsl:value-of select="'We note that '"/>
  </xsl:if>

  <xsl:value-of select="REGULAR_DRIVER_DETAILS/DRIVER_NAME"/>
  <xsl:value-of select="' is noted as the regular driver on more than one vehicle: '"/>
  <xsl:for-each select="key('cars-by-driver', REGULAR_DRIVER_DETAILS/DRIVER_NAME)">
    <xsl:value-of select="VEH"/>

    <xsl:choose>
      <xsl:when test="position() &lt; last() - 1">
        <xsl:value-of select="', '"/>
      </xsl:when>
      <xsl:when test="position() = last() - 1">
        <xsl:value-of select="' and '"/>
      </xsl:when>
    </xsl:choose>

  </xsl:for-each>
  <xsl:if test="position() = last()">
    <xsl:value-of select="'. Remember: it is imperative that you supply the details of the correct regular driver, which is the individual who will be driving the vehicle most often in any monthly period, as the premium is calculated on the profile of that person.'"/>
  </xsl:if>
</xsl:for-each>
<INSURANCE_ITEMS>
    <VEHICLE>
        <XMLDOC_VEHICLE>    
            <VEH>POLO</VEH>
            <REGULAR_DRIVER_DETAILS>
                <DRIVER_NAME>SANNIE</DRIVER_NAME>           
            </REGULAR_DRIVER_DETAILS>
        </XMLDOC_VEHICLE>
        <XMLDOC_VEHICLE>    
        <VEH>HYUNDAI</VEH>
            <REGULAR_DRIVER_DETAILS>
                <DRIVER_NAME>SAREL</DRIVER_NAME>
                </REGULAR_DRIVER_DETAILS>
        </XMLDOC_VEHICLE>
        <XMLDOC_VEHICLE>    
        <VEH>GOLF</VEH>
            <REGULAR_DRIVER_DETAILS>
                <DRIVER_NAME>SAM</DRIVER_NAME>                  
            </REGULAR_DRIVER_DETAILS>
        </XMLDOC_VEHICLE>
        <XMLDOC_VEHICLE>    
        <VEH>MAZDA</VEH>
            <REGULAR_DRIVER_DETAILS>
                <DRIVER_NAME>SAM</DRIVER_NAME>
                </REGULAR_DRIVER_DETAILS>
        </XMLDOC_VEHICLE>
        <XMLDOC_VEHICLE>    
        <VEH>BAKKIE</VEH>
            <REGULAR_DRIVER_DETAILS>
                <DRIVER_NAME>SAREL</DRIVER_NAME>
                </REGULAR_DRIVER_DETAILS>
        </XMLDOC_VEHICLE>
    </VEHICLE>
</INSURANCE_ITEMS>