2017-03-19 1 views
0
나는 문제는 XML에서 데이터를 얻을려고지고있어

, 나는이 하나있어 각 범주의필터 결과 XSL

<?xml version="1.0" encoding="UTF-8"?> 
<base> 
<!-- OFFERS --> 
    <offers> 
    <offer status="1">Sale</offer> 
    <offer status="2">Rent</offer> 
    </offers> 

<!--CATEGORIES--> 
    <categories> 
    <category cat="A">Category 1</category> 
    <category cat="B">Category 2</category> 
    <category cat="C">Category 3</category> 
    </categories> 

<!--OBJECTS--> 
    <objects> 
    <object id="1" offer="1"> 
     <name>Object 1</name> 
     <category cat="A"/> 
     <price>12</price> 
    </object> 

    <object id="2" offer="2"> 
     <name>Object 1</name> 
     <category cat="B"/> 
     <price>1000</price> 
    </object> 

    <object id="3" offer="2"> 
     <name>Object 1</name> 
     <category cat="A"/> 
     <price>10</price> 
    </object> 
    </objects> 

    <object id="4" offer="1"> 
     <name>Object 1</name> 
     <category cat="C"/> 
     <price>60</price> 
    </object> 

    <object id="5" offer="2"> 
     <name>Object 1</name> 
     <category cat="A"/> 
     <price>30</price> 
    </object> 
</base> 

을, 나는 산술 평균을 알 필요가 임대료에있는 가격 (// 이벤트/이벤트)

내 XSL의 :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
    <html> 
    <body> 
     <table border="1"> 
     <tr bgcolor="#9acd32"> 
      <th>Category</th> 
      <th>AM</th> 
     </tr> 
     <xsl:for-each select="//categories/category"> 
      <xsl:variable name="cat" select="@cat"/> 
      <xsl:variable name="object" select="//object[category/@cat=$cat]"/> 
      <xsl:variable name="qtobj" select="count($obj)"/> 

      <tr> 
      <td><xsl:value-of select="." /></td> 
      <td><xsl:value-of select="$object/price div $qtobj"/></td> 
      </tr> 
     </xsl:for-each> 
     </table> 
    </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

내 주요 문제는 내가 단지 임대 객체를 어떻게 필터링하는 모르겠입니다. 나는이 상황을 제대로 이해한다면

답변

1

, 당신은 같은 것을하고 싶지 : 그것을 길을가는

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 

<xsl:key name="obj" match="object" use="concat(category/@cat, '|', @offer)" /> 

<xsl:template match="/base"> 
    <xsl:variable name="rent-status" select="offers/offer[.='Rent']/@status" /> 
    <html> 
     <body> 
      <table border="1"> 
       <tr bgcolor="#9acd32"> 
        <th>Category</th> 
        <th>Average Price (Rent Only)</th> 
       </tr> 
       <xsl:for-each select="categories/category"> 
        <xsl:variable name="objects" select="key('obj', concat(@cat, '|', $rent-status))" /> 
        <tr> 
         <td> 
          <xsl:value-of select="." /> 
         </td> 
         <td> 
          <xsl:value-of select="sum($objects/price) div count ($objects)"/> 
         </td> 
        </tr> 
       </xsl:for-each> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

을, 당신은 정의 할 수 있습니다 :

<xsl:variable name="objects" select="//object[category/@cat=current()/@cat and @offer=$rent-status]"/> 

이지만 key을 사용하면 더 효율적입니다. 그리고 더 우아한.

+0

글쎄, 나는 다른 것들도 잊고 있었다. 열쇠를 사용하는 것은 여전히 ​​어렵습니다. 조금 더 배우고 계속 연습해야합니다. 감사합니다. –