在XSL中使用sort

时间:2017-03-05 20:25:07

标签: xml xslt

我需要对不同的值进行排序,但我无法使其正常运行。

我的示例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排序。

我不确定是否需要使用apply-template或者我是否可以通过其他方式制作

1 个答案:

答案 0 :(得分: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>