2017-03-05 13 views
0

異なる値を並べ替える必要がありますが、機能させることはできません。XSLで並べ替えを使用

私の例のXML:

<?xml-stylesheet type="text/xsl" href="7.xsl"?> 
<immobles> 
    <ofertes> 
     <oferta estat="1">Venda</oferta> 
     <oferta estat="2">Lloguer</oferta> 
    </ofertes> 

    <categories> 
     <categoria cat="A">Pis</categoria> 
     <categoria cat="B">Casa</categoria> 
     <categoria cat="C">Duplex</categoria> 
    </categories> 

    <propietaris> 
     <propietari dni="400001">Fernando</propietari> 
     <propietari dni="400004">Berta</propietari> 
     <propietari dni="400002">Judit</propietari> 
     <propietari dni="400007">Manel</propietari> 
     <propietari dni="400003">Pilar</propietari> 
     <propietari dni="400005">Jordi</propietari>  
    </propietaris> 

    <immobiliaries> 
     <immobiliaria codi="I1">Home sweet home</immobiliaria> 
     <immobiliaria codi="I2">Com a casa enlloc</immobiliaria> 
     <immobiliaria codi="I3">Llar de foc</immobiliaria> 
     <immobiliaria codi="I4">Pisos penyasegat</immobiliaria> 
    </immobiliaries> 

    <propietats> 
     <propietat id="1" oferta="1" propietari="400003"> 
      <nom>Pis a l'eixample</nom> 
      <categoria cat="A"/> 
      <valorat>145000</valorat> 
      <preu>520</preu> 
      <companyies> 
       <companyia comp="I3" /> 
       <companyia comp="I4" /> 
      </companyies> 
     </propietat> 

     <propietat id="2" oferta="2" propietari="400001"> 
      <nom>Casa moderna 4 habitacions</nom> 
      <categoria cat="B"/> 
      <valorat>358000</valorat> 
      <preu>350000</preu> 
      <companyies> 
       <companyia comp="I2" /> 
       <companyia comp="I3" /> 
      </companyies> 
     </propietat> 

     <propietat id="3" oferta="2" propietari="400002"> 
      <nom>Duplex emmoblat lluminós</nom> 
      <categoria cat="C"/> 
      <valorat>210000</valorat> 
      <preu>150000</preu> 
      <companyies> 
       <companyia comp="I1" /> 
      </companyies> 
     </propietat> 

     <propietat id="3" oferta="1" propietari="400005"> 
      <nom>Duplex centre</nom> 
      <categoria cat="C"/> 
      <valorat>160000</valorat> 
      <preu>340</preu> 
      <companyies> 
       <companyia comp="I4" /> 
       <companyia comp="I1" /> 
      </companyies> 
     </propietat> 

    </propietats> 
</immobles> 

私のXSL:

<?xml version="1.0" encoding="UTF-8"?> 
<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>Propietat en lloguer</th> 
     </tr> 
     <xsl:for-each select="//propietat"> 
     <xsl:variable name="idofer" select="@oferta" /> 
     <xsl:variable name="idcat" select="categoria/@cat" /> 
     <xsl:variable name="idpropi" select="@propietari" /> 
     <xsl:variable name="propiofer" select="//ofertes/oferta[@estat=$idofer]" /> 
     <xsl:variable name="propicat" select="//categories/categoria[@cat=$idcat]" /> 
     <xsl:variable name="propipropieari" select="//propietaris/propietari[@dni=$idpropi]" /> 
     <tr> 
     <xsl:choose> 
      <xsl:when test="$propiofer='Lloguer'"> 
      <xsl:apply-templates select="nom"> 
       <xsl:sort select="preu" order="ascending" /> 
       <xsl:sort select="$propicat" order="descending" /> 
       <xsl:sort select="$propipropietari" order="descending" /> 
      </xsl:apply-templates> 
      </xsl:when> 
      <xsl:otherwise> 
      </xsl:otherwise> 
     </xsl:choose> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

私は "Lloguer" ofertes/oferta、およびpreucategories/categoriapropietaris/propietariのためにそれらによって順になっている値を表示する必要があります。

私が適用さ-テンプレートを使用する必要がある場合のわからないか、私は別の方法まず

+0

この場合、期待する出力を表示できますか?ありがとうございました! –

+0

「propietat/nom」、「categories/categoria」、「propietaris/propietari」から要素を取得するという考えがありました。私はひどく表現していることを理解しています –

答えて

0

からそれを作ることができれば、あなたのoferta要素を検索するためにキーを使用することを検討してください。

その後
<xsl:key name="ofertes" match="oferta" use="@estat" /> 

、 "Lloguer" のofertaを持っているだけpropietatを選択するために、あなたがこれを行うことができますが....

<xsl:for-each select="//propietat[key('ofertes', @oferta)='Lloguer']"> 

あなたはまた、あなたのソートのキーを使用することができます。だから、categoria値によってソートするために、あなたは

<xsl:for-each select="//propietat[key('ofertes', @oferta)='Lloguer']"> 
    <xsl:sort select="preu" order="ascending" /> 
    <xsl:sort select="key('categories', categoria/@cat)" order="descending" /> 

は先発のために、このXSLTを試してみてください...あなたはそうのようなソートで使用することができ、そして、そう

<xsl:key name="categories" match="categoria" use="@cat" /> 

のようなキーを定義します。 ..

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:key name="ofertes" match="oferta" use="@estat" /> 
    <xsl:key name="categories" match="categoria" use="@cat" /> 
    <xsl:key name="propietaris" match="propietari" use="@dni" /> 

    <xsl:template match="/"> 
    <html> 
    <body> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Propietat en lloguer</th> 
     </tr> 
     <xsl:for-each select="//propietat[key('ofertes', @oferta)='Lloguer']"> 
     <xsl:sort select="preu" order="ascending" /> 
     <xsl:sort select="key('categories', categoria/@cat)" order="descending" /> 
     <xsl:sort select="key('propietaris', @propietari)" order="descending" /> 
     <tr> 
      <td><xsl:value-of select="nom" /></td> 
      <td><xsl:value-of select="key('categories', categoria/@cat)" /></td> 
      <td><xsl:value-of select="key('propietaris', @propietari)" /></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 
+0

あなたのオプションは素敵ですが、キーの正確な機能は何ですか?ごめんなさい、私は –

+0

キーを起動しています。キーを使うと、XMLの他の値をもっと効率的に検索することができます。それらについては、こちらをご覧ください。https://www.xml.com/pub/a/2002/02/06/key-lookups.html –

関連する問題