2014-02-05 37 views
0

循环如何检查时,它是第一次程序运行<xsl:if test="$DriverCount > 1">语句,以便程序做了一次计数迭代。什么时候它最后一次运行相同的if语句,以便它只做一次其他操作? position()和数量不工作的if语句不总是在位置上运行()= 1。我不能使用模板函数和无法为我使用XF设计师写任何XSL功能,这些关键字不能在那里使用。XSL - 在-每个条件

XML

<?xml version="1.0" encoding="UTF-8"?> 
<ROOT> 
    <DETAILS> 
     <NAME>SANNIE</NAME> 
     <SURNAME>DELANGE</SURNAME> 
    </DETAILS> 
    <INSURANCE_ITEMS> 
     <VEHICLE> 
     <XMLDOC_VEHICLE> 
      <REGULAR_DRIVER_DETAILS> 
       <DRIVER_NAME>SAM</DRIVER_NAME> 
       <VEH>POLO</VEH> 
      </REGULAR_DRIVER_DETAILS> 
     </XMLDOC_VEHICLE> -<XMLDOC_VEHICLE> 
      <REGULAR_DRIVER_DETAILS> 
       <DRIVER_NAME>SANNIE</DRIVER_NAME> 
       <VEH>GOLF</VEH> 
      </REGULAR_DRIVER_DETAILS> 
     </XMLDOC_VEHICLE> <XMLDOC_VEHICLE> 
      <REGULAR_DRIVER_DETAILS> 
       <DRIVER_NAME>SANNIE</DRIVER_NAME> 
       <VEH>GOLF</VEH> 
      </REGULAR_DRIVER_DETAILS> 
     </XMLDOC_VEHICLE> <XMLDOC_VEHICLE> 
      <REGULAR_DRIVER_DETAILS> 
       <DRIVER_NAME>SAM</DRIVER_NAME> 
       <VEH>MAZDA</VEH> 
      </REGULAR_DRIVER_DETAILS> 
     </XMLDOC_VEHICLE> 
     </VEHICLE> 
    </INSURANCE_ITEMS> 
</ROOT> 

XSL

<xsl:for-each select="/ROOT/INSURANCE_ITEMS/VEHICLE/XMLDOC_VEHICLE[not(REGULAR_DRIVER_DETAILS/DRIVER_NAME = preceding-sibling::XMLDOC_VEHICLE/REGULAR_DRIVER_DETAILS/DRIVER_NAME)]"> 
    <xsl:variable select="REGULAR_DRIVER_DETAILS/DRIVER_NAME" name="Driver"/> 
    <xsl:variable select="count(/ROOT/INSURANCE_ITEMS/VEHICLE/XMLDOC_VEHICLE/REGULAR_DRIVER_DETAILS[DRIVER_NAME=$Driver])" name="DriverCount"/> 
    <xsl:if test="$DriverCount > 1"> 
     <xsl:value-of select="'Hello '"/> 
     <xsl:value-of select="REGULAR_DRIVER_DETAILS/DRIVER_NAME"/> 
     <xsl:value-of select="' your cars are: '"/> 
     <xsl:for-each select="/ROOT/INSURANCE_ITEMS/VEHICLE/XMLDOC_VEHICLE[REGULAR_DRIVER_DETAILS/DRIVER_NAME=$Driver]"> 
     <xsl:value-of select="REGULAR_DRIVER_DETAILS/VEH"/> 
     <xsl:if test="$Driver = following-sibling::XMLDOC_VEHICLE/REGULAR_DRIVER_DETAILS/DRIVER_NAME"> 
      <xsl:value-of select="' and '"/> 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:if> 
</xsl:for-each> 
+0

可以使用什么版本的XSLT的?你是说你的工具不会让你定义任何你自己的模板?那么需要去模板之外的其他事情呢?例如,你能定义一个键吗?我得到的是,这看起来像是一个相当标准的分组问题,可以使用for-each-group(如果你有XSLT 2.0)或Muenchian方法(如果你被困在1.0中)解决。 –

+0

谢谢,Muenchian方法完美地工作。我使用1.0版本。我发现在使用XF Designer时需要在GLOBAL XSLT下声明“XSL:KEY”。模板也是这样工作的。我发布了我的最终版本 – user3275527

回答

0

感谢一个新的工具,该muenchian方法解决我的问题。

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

使用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记为一个以上的车辆常规驱动程序:GOLF和马自达; SAREL被认为是一辆以上车辆的正规驾驶者:HYUNDAI和BAKKIE。记住:您必须提供正确的普通驾驶员的详细信息,这是在任何月份期间最常驾驶车辆的个人,因为保险费是根据该人的个人资料计算的。

+0

使用XSLT 1.0,XF Designer:请注意使用XF Designer时,应在Global XSLT下声明以下内容: user3275527

0

您可以后添加进一步的检查没有其他REGULAR_DRIVER_DETAILS/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)]"> 

结果:

你好SAM的车:POLO和MAZDAHello SANNIE你的车:高尔夫

即省略Sannie的其他高尔夫。

然而,这整个的做法看起来很确实势在必行。也许时间:-)