0

如何检查程序第一次运行<xsl:if test="$DriverCount > 1">语句的时间,以便程序只执行一次。它最后一次运行相同的 if 语句以便它只执行一次其他操作是什么时候?position()并且数字不起作用,因为 if 语句并不总是在 position() = 1 上运行。我不能使用模板函数,也不能编写任何 XSL 函数,因为我正在使用 XF 设计器,并且这些关键字不能在那里使用。

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

2 回答 2

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 和 MAZDA;并且 SAREL 被认为是不止一种车辆的常规驾驶员:现代和 BAKKIE。请记住:您必须提供正确的常规驾驶员的详细信息,这是在任何月度期间最常驾驶车辆的个人,因为保费是根据该人的个人资料计算的。

于 2014-02-09T20:36:12.830 回答
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 和 MAZDA 你好 SANNIE 你的车是 GOLF

即 Sannie 的其他 GOLF 被省略。

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

于 2014-02-05T15:03:52.743 回答