2017-03-05 90 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> 

我需要他们preucategories/categoriapropietaris/propietari表明,在 “Lloguer” ofertes/oferta值和订单。

我不知道,如果我需要使用应用模板,或者如果我可以从其他途径

+0

你能在这种情况下显示你期望的输出吗?谢谢! –

+0

这个想法是从'propietat/nom','categories/categoria'和'propietaris/propietari'获取元素。我明白,我表达不好 –

回答

0

首先做到,可以考虑使用一键查找您oferta元素。

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

然后,只选择propietat其中有 “Lloguer” 的oferta,你可以做到这一点....

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

您还可以使用钥匙在你的排序。因此,由categoria值进行排序,你需要定义像这样

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

一个键,然后,你可以用它的排序是这样的...

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

Keys使您能够更高效地从XML中查找其他值。在这里阅读有关它们的信息https://www.xml.com/pub/a/2002/02/06/key-lookups.html –