2017-02-24 26 views
-1

下図のように私は2つのXSLTでの条件場合があります。動的条件実行XSLT

<xsl:if test="ns2:RoadPart/ns2:Vehicles/ns3:SemiVehicle>// for semi vehicle 
//code to show values from XML(ie 20,20) 
</xsl:if> 

<xsl:if test="ns2:RoadPart/ns2:Vehicles/ns3:NonsemiVehicle>// for non-semivehicle 
//code to show values from XML(ie 10,10) 
</xsl:if> 

次のように私のXMLは次のとおりです。私はこのXSLTを解析する場合

// For Non semi vehicle 
<RoutePart Id="374941"> 
<Vehicles> 
<NonsemiVehicle> 
<OverallLengthListPosition xmlns="http://www.esdal.com/schemas/core/vehicle"> 
       <OverallLength> 
       <IncludingProjections>10</IncludingProjections> 
       <ExcludingProjections>10</ExcludingProjections> 
       </OverallLength> 
      </OverallLengthListPosition> 
</NonsemiVehicle> 
</Vehicles> 
</RoutePart> 

// For Semi vehicle 
<RoutePart Id="374941"> 
<Vehicles> 
<SemiVehicle> 
<OverallLengthListPosition xmlns="http://www.esdal.com/schemas/core/vehicle"> 
       <OverallLength> 
       <IncludingProjections>20</IncludingProjections> 
       <ExcludingProjections>20</ExcludingProjections> 
       </OverallLength> 
      </OverallLengthListPosition> 
</SemiVehicle> 
</Vehicles> 
</RoutePart> 

たびSemiVehicleが最初に表示され、非セミ車両を2番目とする。私は毎回私の与えられたXMLごとにこれを動的にしたい。

お願いします。

編集XSLTの詳細:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="1.0" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ns1="http://test/schemas/core/proposedroute" 
    xmlns:ns2="http://test/schemas/core/movement" 
    xmlns:ns3="http://test/schemas/core/vehicle" 
    xmlns:ns4="http://test/schemas/core/commontypes" 
    xmlns:ns5="http://test/schemas/core/route" 
    xmlns:ns6="http://test/schemas/core/drivinginstruction" 
    xmlns:ns7="http://test/schemas/core/formattedtext" 
    xmlns:ns8="http://test/people/bs7666" 
    xmlns:ns9="http://test/schemas/core/annotation" 
    xmlns:ns10="http://test/schemas/core/caution" 
    xmlns:ns11="http://test/schemas/common/movementversion" 
    xmlns:ns12="http://test/schemas/core/contact"> 

    <xsl:param name="Contact_ID"></xsl:param> 
    <xsl:param name="UnitType"></xsl:param> 

    <xsl:param name="DocType"></xsl:param> 
    <xsl:template match="/ns1:Proposal"> 

    <html> 
     <body style="font-family:Arial;font-size:13px;"> 

     <br/> 
     <b>Provisional Route</b> 



     <!--Change Code Start RM#4604 21 july--> 
     <xsl:variable name="FirstVehicle"> 

      <xsl:for-each select="ns2:RouteParts/ns2:RoutePartListPosition/ns2:RoutePart/ns2:RoadPart/ns2:Vehicles"> 
      <xsl:if test="ns3:ConfigurationSummaryListPosition/ns3:ConfigurationSummary != ''"> 
       <xsl:if test="position()=1"> 
       <xsl:choose> 
        <xsl:when test="contains(ns3:ConfigurationSummaryListPosition/ns3:ConfigurationSummary, '##**##')"> 
        <xsl:value-of select="substring-after(ns3:ConfigurationSummaryListPosition/ns3:ConfigurationSummary,'##**##')"/> 
        </xsl:when> 
        <xsl:otherwise> 
        <xsl:value-of select="ns3:ConfigurationSummaryListPosition/ns3:ConfigurationSummary"/> 
        </xsl:otherwise> 
       </xsl:choose> 
       </xsl:if> 
      </xsl:if> 
      </xsl:for-each> 

     </xsl:variable> 

     <xsl:variable name="StatusVehicle"> 
      <xsl:for-each select="ns2:RouteParts/ns2:RoutePartListPosition/ns2:RoutePart/ns2:RoadPart/ns2:Vehicles"> 
      <xsl:if test="ns3:ConfigurationSummaryListPosition/ns3:ConfigurationSummary != ''"> 

       <xsl:choose> 
       <xsl:when test="contains(ns3:ConfigurationSummaryListPosition/ns3:ConfigurationSummary, '##**##')"> 

        <xsl:if test="$FirstVehicle != substring-after(ns3:ConfigurationSummaryListPosition/ns3:ConfigurationSummary,'##**##')"> 
        <xsl:value-of select="false()"/> 
        </xsl:if> 

       </xsl:when> 
       <xsl:otherwise> 
        <xsl:if test="$FirstVehicle != ns3:ConfigurationSummaryListPosition/ns3:ConfigurationSummary"> 
        <xsl:value-of select="false()"/> 
        </xsl:if> 
       </xsl:otherwise> 
       </xsl:choose> 

      </xsl:if> 
      </xsl:for-each> 
     </xsl:variable> 

     <xsl:variable name="CountVehicles"> 
      <xsl:for-each select="ns2:RouteParts/ns2:RoutePartListPosition/ns2:RoutePart"> 

      <xsl:if test="$UnitType=692001"> 
       <xsl:if test="$StatusVehicle = 'false'"> 
       <item> 
        Leg: 
        <xsl:choose> 
        <xsl:when test="contains(ns2:Name, '##**##')"> 
         <xsl:value-of select="substring-after(ns2:Name, '##**##')"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:value-of select="ns2:Name" /> 
        </xsl:otherwise> 
        </xsl:choose> 
        <xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text> 
        <xsl:choose> 
        <!--Changes for RM#4998--> 
        <xsl:when test="contains(ns2:RoadPart/ns2:Distance/ns2:Metric/ns2:Distance, '##**##')"> 
         <xsl:call-template name="SplitAlternative"> 
         <xsl:with-param name="pText" select="substring-after(ns2:RoadPart/ns2:Distance/ns2:Metric/ns2:Distance, '##**##')"></xsl:with-param> 
         <xsl:with-param name="pDelim" select=" OR"></xsl:with-param> 
         </xsl:call-template> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:call-template name="SplitAlternative"> 
         <xsl:with-param name="pText" select="ns2:RoadPart/ns2:Distance/ns2:Metric/ns2:Distance"></xsl:with-param> 
         <xsl:with-param name="pDelim" select=" OR"></xsl:with-param> 
         </xsl:call-template> 
        </xsl:otherwise> 
        </xsl:choose> 
       </item> 
       </xsl:if> 
      </xsl:if> 

      <xsl:if test="$UnitType=692002"> 
       <xsl:if test="$StatusVehicle = 'false'"> 
       <item> 
        Leg: 
        <xsl:choose> 
        <xsl:when test="contains(ns2:Name, '##**##')"> 
         <xsl:value-of select="substring-after(ns2:Name, '##**##')"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:value-of select="ns2:Name" /> 
        </xsl:otherwise> 
        </xsl:choose> 
        <xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text> 
        <xsl:choose> 
        <!--Changes for RM#4998--> 
        <xsl:when test="contains(ns2:RoadPart/ns2:Distance/ns2:Metric/ns2:Distance, '##**##')"> 
         <xsl:call-template name="SplitAlternative"> 
         <xsl:with-param name="pText" select="substring-after(ns2:RoadPart/ns2:Distance/ns2:Imperial/ns2:Distance, '##**##')"></xsl:with-param> 
         <xsl:with-param name="pDelim" select=" OR"></xsl:with-param> 
         </xsl:call-template> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:call-template name="SplitAlternative"> 
         <xsl:with-param name="pText" select="ns2:RoadPart/ns2:Distance/ns2:Imperial/ns2:Distance"></xsl:with-param> 
         <xsl:with-param name="pDelim" select=" OR"></xsl:with-param> 
         </xsl:call-template> 
        </xsl:otherwise> 
        </xsl:choose> 
       </item> 
       </xsl:if> 
      </xsl:if> 
      </xsl:for-each> 
     </xsl:variable> 

     <xsl:variable name="VehiclesArray" select="msxsl:node-set($CountVehicles)/item" /> 

     <!--Change Code End RM#4604 21 july--> 



     <!--For Semi Vehicles--> 
     <xsl:if test="ns2:RouteParts/ns2:RoutePartListPosition/ns2:RoutePart/ns2:RoadPart/ns2:Vehicles/ns3:VehicleSummaryListPosition/ns3:VehicleSummary/ns3:Configuration/ns3:SemiVehicle/ns3:Summary !=''"> 
      <xsl:for-each select="ns2:RouteParts/ns2:RoutePartListPosition/ns2:RoutePart/ns2:RoadPart/ns2:Vehicles/ns3:VehicleSummaryListPosition/ns3:VehicleSummary/ns3:Configuration/ns3:SemiVehicle"> 

      <xsl:variable name="getPosition" select="position()" /> 

      <xsl:if test="$getPosition &gt; 1"> 
       <b> 
       <xsl:value-of select="$VehiclesArray[$getPosition]"/> 
       </b> 
       <br></br> 
      </xsl:if> 
      <br/> 
      <table style ="margin-left" border = "1"> 
       <tr> 
       <td> 
        <b> 
        <!--TODO 1--> 
        Semi trailer 
        </b> 
       </td> 
       <td colspan="2"> 
        <b> 
        <xsl:if test="ns3:Summary!='' "> 
         <xsl:value-of select="ns3:Summary"/> 
        </xsl:if> 
        </b> 
       </td> 
       </tr> 
       <!--</xsl:if >--> 
       <xsl:if test="ns3:GrossWeight/ns3:Weight!=''"> 
       <tr> 
        <td>Gross weight:</td> 

        <td colspan="2"> 
        <xsl:if test="ns3:GrossWeight/ns3:Weight!=''"> 
         <xsl:choose> 
         <xsl:when test="contains(ns3:GrossWeight/ns3:Weight, '##**##')"> 
          <xsl:value-of select="substring-after(ns3:GrossWeight/ns3:Weight, '##**##')"/> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:value-of select="ns3:GrossWeight/ns3:Weight"/> 
         </xsl:otherwise> 
         </xsl:choose> 

         <xsl:choose> 
         <xsl:when test="$UnitType='' or $UnitType=692001"> 
          <xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>kg 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>kg 
         </xsl:otherwise> 
         </xsl:choose> 
        </xsl:if> 
        </td> 


       </tr> 
       </xsl:if> 
       <xsl:if test="ns3:AxleConfiguration/ns3:AxleWeightListPosition/ns3:AxleWeight !=''"> 
       <tr> 
        <td>Axle weight:</td> 

        <td colspan="2"> 
        <xsl:for-each select="ns3:AxleConfiguration/ns3:AxleWeightListPosition"> 

         <xsl:if test="ns3:AxleWeight!='' and ns3:AxleWeight/@AxleCount!=''"> 
         <xsl:choose> 
          <xsl:when test="contains(ns3:AxleWeight, '##**##')"> 
          <xsl:value-of select="substring-after(ns3:AxleWeight, '##**##')"/> 
          </xsl:when> 
          <xsl:otherwise> 
          <xsl:value-of select="ns3:AxleWeight"/> 
          </xsl:otherwise> 
         </xsl:choose> 
         <xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>kg<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text> x<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text> 
         <xsl:choose> 
          <xsl:when test="contains(ns3:AxleWeight/@AxleCount, '##**##')"> 
          <xsl:value-of select="substring-after(ns3:AxleWeight/@AxleCount, '##**##')"/> 
          </xsl:when> 
          <xsl:otherwise> 
          <xsl:value-of select="ns3:AxleWeight/@AxleCount"/> 
          </xsl:otherwise> 
         </xsl:choose> 
         </xsl:if> 

         <xsl:if test="position() != last()"> 
         , 
         </xsl:if> 

        </xsl:for-each> 

        </td> 


       </tr> 
       </xsl:if> 
      </table> 
      <br/> 
      </xsl:for-each> 
     </xsl:if> 
     <!--For Semi Vehicles Ends here--> 

     <!--For Non Semi Vehicles--> 
     <xsl:if test="ns2:RouteParts/ns2:RoutePartListPosition/ns2:RoutePart/ns2:RoadPart/ns2:Vehicles/ns3:VehicleSummaryListPosition/ns3:VehicleSummary/ns3:Configuration/ns3:NonSemiVehicle/ns3:ComponentListPosition/ns3:Component/ns3:DrawbarTractor/ns3:Summary != '' 
        or ns2:RouteParts/ns2:RoutePartListPosition/ns2:RoutePart/ns2:RoadPart/ns2:Vehicles/ns3:VehicleSummaryListPosition/ns3:VehicleSummary/ns3:Configuration/ns3:NonSemiVehicle/ns3:ComponentListPosition/ns3:Component/ns3:LoadBearing/ns3:Summary != '' "> 

      <xsl:for-each select="ns2:RouteParts/ns2:RoutePartListPosition/ns2:RoutePart/ns2:RoadPart/ns2:Vehicles/ns3:VehicleSummaryListPosition/ns3:VehicleSummary/ns3:Configuration/ns3:NonSemiVehicle/ns3:ComponentListPosition"> 

      <xsl:variable name="getPosition" select="position()" /> 

      <xsl:if test="$getPosition &gt; 1"> 
       <b> 
       <xsl:value-of select="$VehiclesArray[$getPosition]"/> 
       </b> 
       <br></br> 
      </xsl:if> 

      <br></br> 
      <table style ="margin-left" border = "1"> 
       <tr> 
       <td> 
        <b> 
        <!--TODO 1--> 

        <xsl:choose> 
         <xsl:when test="contains(ns3:Component, 'tractor')"> 
         Tractor 
         </xsl:when> 
         <xsl:when test="contains(ns3:Component, 'trailer')"> 
         Trailer 
         </xsl:when> 
         <xsl:when test="contains(ns3:Component, 'spmt')"> 
         SPMT 
         </xsl:when> 
         <xsl:otherwise> 
         Tractor 
         </xsl:otherwise> 
        </xsl:choose> 
        </b> 
       </td> 
       <td colspan="2"> 
        <b> 
        <xsl:if test="contains(ns3:Component/ns3:DrawbarTractor/ns3:Summary, '##**##')=false()"> 
         <xsl:value-of select="ns3:Component/ns3:DrawbarTractor/ns3:Summary"/> 
        </xsl:if> 

        <xsl:if test="contains(ns3:Component/ns3:DrawbarTractor/ns3:Summary, '##**##')=true()"> 
         <xsl:value-of select="substring-after(ns3:Component/ns3:DrawbarTractor/ns3:Summary, '##**##')"/> 
        </xsl:if> 

        <xsl:if test="contains(ns3:Component/ns3:LoadBearing/ns3:Summary, '##**##')=false()"> 
         <xsl:value-of select="ns3:Component/ns3:LoadBearing/ns3:Summary"/> 
        </xsl:if> 

        <xsl:if test="contains(ns3:Component/ns3:LoadBearing/ns3:Summary, '##**##')=true()"> 
         <xsl:value-of select="substring-after(ns3:Component/ns3:LoadBearing/ns3:Summary, '##**##')"/> 
        </xsl:if> 
        </b> 
       </td> 
       </tr> 
       <!--</xsl:if >--> 
       <xsl:if test="ns3:Component/ns3:DrawbarTractor/ns3:Weight!=''"> 
       <tr> 
        <td>Gross weight:</td> 
        <td colspan="2"> 

        <xsl:call-template name="parseString"> 
         <xsl:with-param name="list" select="ns3:Component/ns3:DrawbarTractor/ns3:Weight"/> 
        </xsl:call-template> 

        <xsl:choose> 
         <xsl:when test="$UnitType='' or $UnitType=692001"> 
         <xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>kg 
         </xsl:when> 
         <xsl:otherwise> 
         <xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>kg 
         </xsl:otherwise> 
        </xsl:choose> 

        </td> 
       </tr> 
       </xsl:if> 
      </table> 
      <br/> 
      </xsl:for-each> 
     </xsl:if> 
     <!--For Non Semi Vehicles Ends here--> 

     </body> 
    </html> 
    </xsl:template> 

    <!--Changes for RM#4998 start--> 
    <xsl:template match="text()" name="SplitAlternative"> 
    <xsl:param name="pText" select="."/> 
    <xsl:param name="pDelim" select="' OR'"/> 
    <xsl:param name="pCounter" select="1"/> 
    <xsl:if test="string-length($pText) > 0"> 
     <xsl:variable name="vToken" select= 
    "substring-before(concat($pText,' OR'), ' OR')"/> 
     <!--<xsl:value-of select="$vToken"/> 
     <xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;,&nbsp;]]></xsl:text> 
     <xsl:value-of select="$pCounter"/>--> 

     <xsl:if test="not($pCounter = 1)"> 
     or<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text> 
     </xsl:if> 
     <xsl:if test="$UnitType='' or $UnitType=692001"> 
     <xsl:variable name="varKM" select="round(number($vToken) div number(1000))"/> 
     <xsl:value-of select="$varKM"/> <xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>km 
     </xsl:if> 
     <xsl:if test="$UnitType=692002"> 
     <xsl:variable name="varMiles" select="round(number($vToken) div number(1760))"/> 
     <xsl:value-of select="$varMiles"/><xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>miles 
     </xsl:if> 
     <xsl:call-template name="SplitAlternative"> 
     <xsl:with-param name="pText" select= 
     "substring-after($pText,'OR')"/> 
     <xsl:with-param name="pCounter" 
     select="$pCounter + 1"/> 
     </xsl:call-template> 

    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 
+1

完全な(そして最小限の)XSLTスタイルシートを表示し、これらの入力XMLドキュメントごとに、出力結果を明確に表示してください。ありがとう。その他のヘルプ:http://stackoverflow.com/help/mcve –

+0

XSLTは非常に大きく、出力はこれに何の違いもありません。私はIF条件の動的順序がほしいだけです。より明確化が必要な場合はお知らせください。どうもありがとう。 –

+0

私はあなたにもっと明確にする必要があることをお知らせします。あなたのXSLTスタイルシートは、その問題の一部に非常に大きくなっています。それを分解し、非常に小さなスタイルシートで問題を切り分けて、ここに投稿してください。 –

答えて

0

は、なぜあなたは、これらの条件のチェックが必要なのでしょうか?あなたは、単にVehiclesのすべての子要素を処理するために

<xsl:template match="/"> 
    <xsl:apply-templates select="ns2:RoadPart/ns2:Vehicles/*"/> 
</xsl:template> 

を使用するか、いくつかがある場合、あなたはもちろん

<xsl:template match="/"> 
    <xsl:apply-templates select="ns2:RoadPart/ns2:Vehicles/ns3:SemiVehicle | ns2:RoadPart/ns2:Vehicles/ns3:NonsemiVehicle"/> 
</xsl:template> 

プラステンプレート(またはそれ以上)を使用することができます処理しない場合出力する値を出力するために、要素は処理され、ドキュメント順に出力されます。少なくとも一つ見つけSemiVehicle、見つかった少なくとも1 NonsemiVehicleがある場合

ns2:RoadPart/ns2:Vehicles/ns3:NonsemiVehicle 

が真の条件がある場合

0

あなたの条件

ns2:RoadPart/ns2:Vehicles/ns3:SemiVehicle 

はtrueです。

通常、両方の条件が真となり、両方の分岐が実行されます。私はあなたが望むものではないと思う。あなたは、SemiVehiclesとNonsemiVehiclesのための異なるロジックを使って、すべての車両を処理したいと思う。

これがテンプレートルールの目的です。車両の両方の種類の構造は、あなたが同じテンプレートルールを使用することがありますように似ているように思われることを除いて、その後

<xsl:apply-templates select="ns2:RoadPart/ns2:Vehicles/*"/> 

<xsl:template match="ns3:SemiVehicle"> 
    //code to show values from XML(ie 20,20) 
</xsl:template> 

<xsl:template match="ns3:NonsemiVehicle"> 
    //code to show values from XML(ie 10,10) 
</xsl:template> 

:私はあなたのコードは次のようになりますだと思いますどちらも。