8
votes

XSLT: Trier par le bas des 2 valeurs

J'ai quelques XML qui est formaté comme suit:

<products>
  <product>
    <name>Product 1</name>
    <price>
      <orig>15</orig>
      <offer>10</offer>
    </price>
  </product>
  <product>
    <name>Product 2</name>
    <price>
      <orig>13</orig>
      <offer>12</offer>
    </price>
  </product>
  <product>
    <name>Product 3</name>
    <price>
      <orig>11</orig>
    </price>
  </product>
</products>


0 commentaires

3 Réponses :


6
votes

(réponse mise à jour pour inclure les pensées sur XSLT 1.0 et 2.0)

i. XSLT 1.0:

Notez que XSLT 1.0 n'a pas d'équivalent intégré à min () ; En supposant que votre parser prend en charge EXSLT , vous pouvez utiliser son math: min () fonction pour obtenir une solution assez similaire à La variante XSLT 2.0 ci-dessous.


ii. Xslt 2.0:

Voici une solution qui utilise la fonction d'agrégation XPath 2.0 min () .

quand il Solution XSLT 2.0: xxx

.. est appliqué sur xml fourni: xxx

.. Le résultat recherché est produit: xxx


3 commentaires

@Marks - J'ai mis à jour ma réponse pour fournir une solution XSLT 1.0 possible. Savez-vous: Votre analyseur XSLT implique-t-il les fonctions d'extension EXSLT (ou, en particulier, le sous-ensemble maths de ces fonctions)?


Cela fait. On dirait que cela pourrait être la solution. Je vais avoir une pièce de théâtre avant de donner des commentaires. Merci beaucoup!


Tout fonctionne bien avec Math: min (prix / *). Réponse vraiment utile - merci encore!



5
votes

une solution XSLT 1.0 qui ne nécessite pas d'EXSLT: xxx


0 commentaires

5
votes

i. Il existe une solution générale et pure XSLT 1.0 - aussi simple que celle-ci forte>: xxx pré>

ii. Si prix code> a d'autres enfants en plus de offre code> et orig code> strong> - dans ce cas la solution générale i fort>. ci-dessus (ainsi que les deux autres réponses à cette question) ne fonctionne pas correctement. P>

Voici une solution correcte pour ce cas strong>: p> xxx PRE>


iii. Si nous savons que offre code> ne dépasse jamais orig code> strud>: p> xxx pré>

iv. Vérification forte>: p>

Les trois transformations ci-dessus, lorsqu'elles sont appliquées au document XML fourni: P>

<products>
  <product>
    <name>Product 1</name>
    <price>
      <orig>15</orig>
      <offer>10</offer>
      <minAcceptable>8</minAcceptable>
    </price>
  </product>
  <product>
    <name>Product 2</name>
    <price>
      <orig>13</orig>
      <offer>12</offer>
      <minAcceptable>6</minAcceptable>
    </price>
  </product>
  <product>
    <name>Product 3</name>
    <price>
      <orig>11</orig>
      <minAcceptable>7</minAcceptable>
    </price>
  </product>
</products>


2 commentaires

+1 Très élégant - beau travail, @dimitrenrovatatv. Je soutiendrais toutefois que la solution II n'est pas appropriée à la question (car elle répond à une situation jamais décrite par le PO) et ne devrait donc pas être utilisée comme preuve d'inadéquation dans d'autres réponses. :)


@Abach, vous êtes les bienvenus. En ce qui concerne la pertinence, les deux solution 1. et 3. Suivre exactement le document XML de l'OP. La solution 2 nous donne la connaissance de quoi faire dans une situation légèrement différente, lorsque d'autres solutions ne fonctionnent pas. La connaissance est le pouvoir, n'est-ce pas le Thonk, alors?