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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
如何将sql查询转换为xslt?_Xslt - Fatal编程技术网

如何将sql查询转换为xslt?

如何将sql查询转换为xslt?,xslt,Xslt,我有一个xml文件 <ServiceHotel> <AvailableRoom> <HotelOccupancy> <RoomCount>1</RoomCount> <Occupancy> <AdultCount>1</AdultCount> <ChildCount>1</Chil

我有一个xml文件

<ServiceHotel>
    <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>1</AdultCount>
            <ChildCount>1</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Room Only</Board>
            <RoomType>Double/twin Superior</RoomType>
            <Price>
                <Amount>21.168</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>3</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Room Only</Board>
            <RoomType>Twin Superior</RoomType>
            <Price>
                <Amount>34.195</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>1</AdultCount>
            <ChildCount>1</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Room Only</Board>
            <RoomType>Double/twin Superior</RoomType>
            <Price>
                <Amount>25.618</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>3</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Room Only</Board>
            <RoomType>Double/twin Superior</RoomType>
            <Price>
                <Amount>38.645</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>1</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Room Only</Board>
            <RoomType>Single Superior</RoomType>
            <Price>
                <Amount>25.618</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>1</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Room Only</Board>
            <RoomType>Double Superior</RoomType>
            <Price>
                <Amount>19.840</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>3</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Bed and Breakfast</Board>
            <RoomType>Twin Superior</RoomType>
            <Price>
                <Amount>34.195</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>3</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Bed and Breakfast</Board>
            <RoomType>Double/twin Superior</RoomType>
            <Price>
                <Amount>38.645</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>1</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Bed and Breakfast</Board>
            <RoomType>Single Superior</RoomType>
            <Price>
                <Amount>25.618</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>1</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Bed and Breakfast</Board>
            <RoomType>Double Superior</RoomType>
            <Price>
                <Amount>19.840</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>3</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Full Board</Board>
            <RoomType>Twin Superior</RoomType>
            <Price>
                <Amount>35.195</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>3</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Full Board</Board>
            <RoomType>Double/twin Superior</RoomType>
            <Price>
                <Amount>32.645</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>3</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Half Board</Board>
            <RoomType>Twin Superior</RoomType>
            <Price>
                <Amount>35.195</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>3</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Half Board</Board>
            <RoomType>Double/twin Superior</RoomType>
            <Price>
                <Amount>32.645</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>1</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Half Board</Board>
            <RoomType>Single Superior</RoomType>
            <Price>
                <Amount>28.618</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>1</AdultCount>
            <ChildCount>0</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Half Board</Board>
            <RoomType>Double Superior</RoomType>
            <Price>
                <Amount>20.840</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
  <AvailableRoom>
        <HotelOccupancy>
        <RoomCount>1</RoomCount>
        <Occupancy>
            <AdultCount>1</AdultCount>
            <ChildCount>1</ChildCount>
        </Occupancy>
        </HotelOccupancy>
        <HotelRoom>
            <Board>Half Board</Board>
            <RoomType>Double/twin Superior</RoomType>
            <Price>
                <Amount>30.168</Amount>
            </Price>
        </HotelRoom>
  </AvailableRoom>
</ServiceHotel>
我的sql查询的输出是

Grand_Total, Total_Adults,  Board_Type,  Room_Type,  Room_Count,  Adults, Child, Price
75.203  110 Room Only   Double Superior           1    1    0    19.84
75.203  111 Room Only   Double/twin Superior      1    1    1    21.168
75.203  130 Room Only   Twin Superior             1    3    0    34.195
83.653  110 Half Board  Double Superior           1    1    0    20.84
83.653  111 Half Board  Double/twin Superior      1    1    1    30.168
83.653  130 Half Board  Double/twin Superior      1    3    0    32.645 
我需要创建XSL 1.0文件以获取此输出。(相当于SQL查询)

我尝试下面的查询,但工作不好

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html" indent="yes"/>
  <xsl:key name="by-board" match="AvailableRoom" use="HotelRoom/Board"/>

    <xsl:key name="by-b" match="AvailableRoom" use="concat(HotelRoom/Board,'|',HotelOccupancy/Occupancy/AdultCount , '|',HotelOccupancy/Occupancy/ChildCount)"/>

  <xsl:key name="TotalAdults" match="HotelOccupancy" use="concat(Occupancy/AdultCount, '|', Occupancy/ChildCount)" />
  <xsl:variable name="TotalRoomCount" select="count(/ServiceHotel/AvailableRoom/HotelOccupancy [generate-id(.) = generate-id(key('TotalAdults', concat(Occupancy/AdultCount, '|', Occupancy/ChildCount))[1])])" />


  <xsl:template match="/">
  <table cellpadding="0" cellspacing="0"  border="1">

    <tr>
        <td height="28" width="290"><font face="Arial" size="2">Room Type</font></td>
        <td height="28" width="302"><font face="Arial" size="2">Board Type</font></td>
        <td height="28" width="51" align="center"><font face="Arial" size="2">R.Count</font></td>
        <td height="28" width="52" align="center"><font face="Arial" size="2">A.Count</font></td>
        <td height="28" width="52" align="center"><font face="Arial" size="2">C.Count</font></td>
        <td height="28" width="89" align="center"><font face="Arial" size="2">Price</font></td>
    </tr>
    <xsl:apply-templates select="ServiceHotel" />
    </table>
  </xsl:template>

  <xsl:template match="ServiceHotel">
      <xsl:for-each select="AvailableRoom[generate-id() = generate-id(key('by-board', HotelRoom/Board)[1]) 
                             and count(key('by-board', HotelRoom/Board)) >= 
                                $TotalRoomCount 

                                ]">
        <xsl:sort select="sum(key('by-board', HotelRoom/Board)[position() &lt; 4]/HotelRoom/Price/Amount)"/>


       <xsl:apply-templates select="." mode="group"/>

      </xsl:for-each>
  </xsl:template>

  <xsl:template match="AvailableRoom" mode="group">

    <xsl:apply-templates select="key('by-board', HotelRoom/Board)[generate-id() = generate-id(key('by-b', 
    concat(HotelRoom/Board,'|',HotelOccupancy/Occupancy/AdultCount , '|',HotelOccupancy/Occupancy/ChildCount)
    )[1]) 
     ]">

                              <xsl:sort select="HotelRoom/Price/Amount" data-type="number"/>
      </xsl:apply-templates>



    <tr>
        <td height="28" width="290" bgcolor="#FFFFCC"><font face="Arial" size="2"></font></td>
        <td height="28" width="302" bgcolor="#FFFFCC"><font face="Arial" size="2"></font></td>
        <td height="28" width="51" align="center" bgcolor="#FFFFCC"><font face="Arial" size="2"></font></td>
        <td height="28" width="52" align="center" bgcolor="#FFFFCC"><font face="Arial" size="2"></font></td>
        <td height="28" width="52" align="center" bgcolor="#FFFFCC"><font face="Arial" size="2"></font></td>
        <td height="28" width="89" align="center" bgcolor="#FFFFCC"><font face="Arial" size="2"><xsl:value-of select="format-number(sum(key('by-board', HotelRoom/Board)[position() &lt; 4] /HotelRoom/Price/Amount), '#.000')"/></font></td>
    </tr>


  </xsl:template>

  <xsl:template match="AvailableRoom">


        <tr>
        <td height="28" width="290"><font face="Arial" size="2"><xsl:value-of select="HotelRoom/RoomType"/></font></td>
        <td height="28" width="302"><font face="Arial" size="2"><xsl:value-of select="HotelRoom/Board"/></font></td>
                <td height="28" width="51" align="center"><font face="Arial" size="2"><xsl:value-of select="HotelOccupancy/RoomCount"/></font></td>
                <td height="28" width="52" align="center"><font face="Arial" size="2"><xsl:value-of select="HotelOccupancy/Occupancy/AdultCount"/></font></td>
                <td height="28" width="52" align="center"><font face="Arial" size="2"><xsl:value-of select="HotelOccupancy/Occupancy/ChildCount"/></font></td>
        <td height="28" width="89" align="center"><font face="Arial" size="2"><xsl:value-of select="format-number(HotelRoom/Price/Amount, '#.000')"/></font></td>
        </tr>        
  </xsl:template>
</xsl:stylesheet>

房间类型
板型
R.计数
A.计数
C.计数
价格

我相信您的意思是希望XSLT输出与示例SQL当前输出的表相同的表

我可以通过使用节点集扩展函数来实现这一点。当您根据板卡类型“分组”时,结果存储在变量中,而不仅仅是输出房间组

  <xsl:variable name="rooms">
     <xsl:apply-templates 
        select="//AvailableRoom
           [HotelRoom/Board = current()/HotelRoom/Board]
           [generate-id() = generate-id(key('by-b', concat(HotelRoom/Board,'|',HotelOccupancy/Occupancy/AdultCount , '|',HotelOccupancy/Occupancy/ChildCount))[1])]" mode="room" />
  </xsl:variable>

这样,您就可以排除电路板中的元素,例如,这些元素中的元素少于三个

<xsl:if test="count(ns:node-set($rooms)/AvailableRoom) >= 3">

这是完整的XSLT

<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
   xmlns:ns="urn:schemas-microsoft-com:xslt"
   exclude-result-prefixes="ns">

   <xsl:output method="html" indent="yes"/>

   <xsl:key name="by-board" match="AvailableRoom" use="HotelRoom/Board" />
   <xsl:key name="by-b" match="AvailableRoom" use="concat(HotelRoom/Board,'|',HotelOccupancy/Occupancy/AdultCount , '|',HotelOccupancy/Occupancy/ChildCount)"/>     

   <xsl:template match="/ServiceHotel">
      <table border="1">
    <tr>
          <td>Grand Total</td>
          <td>Total Adults?</td>
          <td>Board Type</td>
          <td>Room Type</td>
          <td>Room Count</td>
          <td>Adults</td>
          <td>Child</td>
          <td>Price</td>
       </tr>       
         <xsl:apply-templates select="AvailableRoom[generate-id() = generate-id(key('by-board',HotelRoom/Board)[1])]" mode="board" />
      </table>
   </xsl:template>

   <xsl:template match="AvailableRoom" mode="board">
      <xsl:variable name="rooms">
         <xsl:apply-templates 
            select="//AvailableRoom
               [HotelRoom/Board = current()/HotelRoom/Board]
               [generate-id() = generate-id(key('by-b', concat(HotelRoom/Board,'|',HotelOccupancy/Occupancy/AdultCount , '|',HotelOccupancy/Occupancy/ChildCount))[1])]" mode="room" />
      </xsl:variable>
      <xsl:if test="count(ns:node-set($rooms)/AvailableRoom) >= 3">
         <xsl:apply-templates select="ns:node-set($rooms)/AvailableRoom">
            <xsl:with-param name="total" select="sum(ns:node-set($rooms)/AvailableRoom/HotelRoom/Price/Amount)" />
            <xsl:sort select="HotelRoom/Price/Amount" />
         </xsl:apply-templates>
      </xsl:if>
   </xsl:template>

   <xsl:template match="AvailableRoom" mode="room">
      <xsl:for-each select="key('by-b', concat(HotelRoom/Board,'|',HotelOccupancy/Occupancy/AdultCount , '|',HotelOccupancy/Occupancy/ChildCount))">
         <xsl:sort select="HotelRoom/Price/Amount" />
         <xsl:if test="position() = 1">
            <xsl:copy-of select="." />
         </xsl:if>
      </xsl:for-each>
   </xsl:template>

   <xsl:template match="AvailableRoom">
      <xsl:param name="total" />
      <tr>
         <td>
            <xsl:value-of select="format-number($total, '0.00')" />
         </td>
         <td>
            <xsl:value-of select="HotelOccupancy/RoomCount"/>
            <xsl:value-of select="HotelOccupancy/Occupancy/AdultCount"/>
            <xsl:value-of select="HotelOccupancy/Occupancy/ChildCount"/>         
         </td>
         <td>
            <xsl:value-of select="HotelRoom/Board"/>
         </td>
         <td>
            <xsl:value-of select="HotelRoom/RoomType"/>
         </td>
         <td>
            <xsl:value-of select="HotelOccupancy/RoomCount"/>
         </td>
         <td>
            <xsl:value-of select="HotelOccupancy/Occupancy/AdultCount"/>
         </td>
         <td>
            <xsl:value-of select="HotelOccupancy/Occupancy/ChildCount"/>
         </td>
         <td>
            <xsl:value-of select="HotelRoom/Price/Amount"/>
         </td>
      </tr>
   </xsl:template>   
</xsl:stylesheet>

总计
成年人总数?
板型
房间类型
房间数
成人
小孩
价格
当应用于示例XML时,将输出以下内容

<table border="1">
   <tr>
      <td>Grand Total</td>
      <td>Total Adults?</td>
      <td>Board Type</td>
      <td>Room Type</td>
      <td>Room Count</td>
      <td>Adults</td>
      <td>Child</td>
      <td>Price</td>
   </tr>
   <tr>
      <td>75.20</td>
      <td>110</td>
      <td>Room Only</td>
      <td>Double Superior</td>
      <td>1</td>
      <td>1</td>
      <td>0</td>
      <td>19.840</td>
   </tr>
   <tr>
      <td>75.20</td>
      <td>111</td>
      <td>Room Only</td>
      <td>Double/twin Superior</td>
      <td>1</td>
      <td>1</td>
      <td>1</td>
      <td>21.168</td>
   </tr>
   <tr>
      <td>75.20</td>
      <td>130</td>
      <td>Room Only</td>
      <td>Twin Superior</td>
      <td>1</td>
      <td>3</td>
      <td>0</td>
      <td>34.195</td>
   </tr>
   <tr>
      <td>83.65</td>
      <td>110</td>
      <td>Half Board</td>
      <td>Double Superior</td>
      <td>1</td>
      <td>1</td>
      <td>0</td>
      <td>20.840</td>
   </tr>
   <tr>
      <td>83.65</td>
      <td>111</td>
      <td>Half Board</td>
      <td>Double/twin Superior</td>
      <td>1</td>
      <td>1</td>
      <td>1</td>
      <td>30.168</td>
   </tr>
   <tr>
      <td>83.65</td>
      <td>130</td>
      <td>Half Board</td>
      <td>Double/twin Superior</td>
      <td>1</td>
      <td>3</td>
      <td>0</td>
      <td>32.645</td>
   </tr>
</table>

总计
成年人总数?
板型
房间类型
房间数
成人
小孩
价格
75.20
110
仅限房间
双优
1.
1.
0
19.840
75.20
111
仅限房间
双人/双人高级
1.
1.
1.
21.168
75.20
130
仅限房间
孪生上级
1.
3.
0
34.195
83.65
110
半板
双优
1.
1.
0
20.840
83.65
111
半板
双人/双人高级
1.
1.
1.
30.168
83.65
130
半板
双人/双人高级
1.
3.
0
32.645

请注意,扩展功能在很大程度上取决于您使用的处理器。在本例中,我使用的是Mircosoft,因此扩展函数的名称空间是urn:schemas microsoft com:xslt。如果您没有使用此功能,则需要找到支持的功能;XSLT很可能用于将一个xml文档转换为另一个xml文档。它不是“数据表示”格式,我不想再谈xsl了。但我认为我们可以在xsl中创建一个组过滤器?您希望输出的文件格式是什么?1)。按董事会+房间数+成人+儿童分组。2) 如果电路板不够,请避免输出该电路板。3) 以董事会最便宜的价格为例,您还没有解释转换必须实现的规则——不要指望XSLT专家熟悉SQL。请编辑问题并提供必要的解释(SQL代码可以省略,因为它很混乱,只占用空间)。
<table border="1">
   <tr>
      <td>Grand Total</td>
      <td>Total Adults?</td>
      <td>Board Type</td>
      <td>Room Type</td>
      <td>Room Count</td>
      <td>Adults</td>
      <td>Child</td>
      <td>Price</td>
   </tr>
   <tr>
      <td>75.20</td>
      <td>110</td>
      <td>Room Only</td>
      <td>Double Superior</td>
      <td>1</td>
      <td>1</td>
      <td>0</td>
      <td>19.840</td>
   </tr>
   <tr>
      <td>75.20</td>
      <td>111</td>
      <td>Room Only</td>
      <td>Double/twin Superior</td>
      <td>1</td>
      <td>1</td>
      <td>1</td>
      <td>21.168</td>
   </tr>
   <tr>
      <td>75.20</td>
      <td>130</td>
      <td>Room Only</td>
      <td>Twin Superior</td>
      <td>1</td>
      <td>3</td>
      <td>0</td>
      <td>34.195</td>
   </tr>
   <tr>
      <td>83.65</td>
      <td>110</td>
      <td>Half Board</td>
      <td>Double Superior</td>
      <td>1</td>
      <td>1</td>
      <td>0</td>
      <td>20.840</td>
   </tr>
   <tr>
      <td>83.65</td>
      <td>111</td>
      <td>Half Board</td>
      <td>Double/twin Superior</td>
      <td>1</td>
      <td>1</td>
      <td>1</td>
      <td>30.168</td>
   </tr>
   <tr>
      <td>83.65</td>
      <td>130</td>
      <td>Half Board</td>
      <td>Double/twin Superior</td>
      <td>1</td>
      <td>3</td>
      <td>0</td>
      <td>32.645</td>
   </tr>
</table>