2010-02-25 10 views
2

Nous avons des logiciels dans lesquels nous recevons des flux de données XML que nous traduisons pour correspondre à notre analyseur de flux. Je travaille sur l'introduction d'un nouveau flux et j'ai du mal à séparer l'une des catégories en raison de la façon dont le flux source entre en jeu. Je ne peux pas changer notre format XML ou le leur, alors je suis coincé avec avoir à le faire dans rien d'autre que XSL (T).Transformation XSL basée sur les valeurs descendantes?

Dans cet exemple théorique, j'ai une liste de produits qui seront affichés dans quelques catalogues qui seront générés. Nous traitons les produits avec un balisage à 100% différemment des articles avec un balisage à 80%. Habituellement, nous obtenons les articles les plus élevés comme un produit distinct, mais dans ce cas, il est beaucoup plus bas dans l'arbre des nœuds.

Le XML que nous obtenons ressemble à quelque chose comme ceci:

<?xml version="1.0" encoding="utf-8" ?> 
<products> 
    <product> 
     <name>lawnmower</name> 
     <prices> 
      <price> 
       <supplier>amazon</supplier> 
       <markup>100%</markup> 
       <price>$200</price> 
      </price> 
      <price> 
       <supplier>newegg</supplier> 
       <markup>80%</markup> 
       <price>$160</price> 
      </price> 
      <price> 
       <supplier>home depot</supplier> 
       <markup>80%</markup> 
       <price>$150</price> 
      </price> 
     </prices> 
    </product> 
    <product> 
     <name>laptop</name> 
     <prices> 
      <price> 
       <supplier>newegg</supplier> 
       <markup>80%</markup> 
       <price>$1000</price> 
      </price> 
     </prices> 
    </product> 
    <product> 
     <name>my little pony</name> 
     <prices> 
      <price> 
       <supplier>amazon</supplier> 
       <markup>80%</markup> 
       <price>$50</price> 
      </price> 
      <price> 
       <supplier>newegg</supplier> 
       <markup>80%</markup> 
       <price>$40</price> 
      </price> 
     </prices> 
    </product> 
</products> 

Et nous voulons le convertir à ressembler à ceci:

<?xml version="1.0" encoding="utf-8" ?> 
<prodlist> 
    <products> 
     <product category="lawnmower"> 
      <price supplier="newegg">$160</price> 
      <price supplier="home depot">$150</price> 
     </product> 
     <product category="lawnmower100"> 
      <price supplier="amazon">$200</price> 
     </product> 
     <product category="laptop"> 
      <price supplier="newegg">$1000</price> 
     </product> 
     <product category="my little pony"> 
      <price supplier="amazon">$50</price> 
     </product> 
    </products> 
</prodlist> 

J'utilise une XSL qui ressemble à peu près comme celui-ci (J'ai clipsée toutes des environs XSL pour tenter un peu de concision):

<xsl:template match="products"> 
    <xsl:element name="product"> 
     <xsl:choose> 
      <xsl:when test = "name = 'lawnmower' and prices/price/markup = '100%'"> 
       <xsl:attribute name="category">lawnmower100</xsl:attribute> 
       <xsl:apply-templates select="prices" /> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:attribute name="category"> 
        <xsl:value-of select="name" /> 
       </xsl:attribute> 
       <xsl:apply-templates select="prices" /> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:element> 
</xsl:template> 

en utilisant cette me donne cependant de mauvais résultats; tout pour les tondeuses à gazon est se tiré dans la catégorie « lawnmower100 », me donner un résultat qui ressemble à ceci:

<?xml version="1.0" encoding="utf-8" ?> 
<prodlist> 
    <products> 
     <product category="lawnmower100"> 
      <price supplier="amazon">$200</price> 
      <price supplier="newegg">$160</price> 
      <price supplier="home depot">$150</price> 
     </product> 
     <product category="laptop"> 
      <price supplier="newegg">$1000</price> 
     </product> 
     <product category="my little pony"> 
      <price supplier="amazon">$50</price> 
     </product> 
    </products> 
</prodlist> 

Je ne suis pas sûr de savoir comment je sélectionnerons les 100% des articles marqués, mais quel que soit Je fais maintenant ne fonctionne pas. J'ai joué avec et mais je ne pense pas que je les utilise correctement, puisque je continue à finir avec ce résultat.

J'espère avoir fourni assez de détails pour que cela ait du sens!

Répondre

2

À moins que je ne me trompe, cela devrait être quelque chose comme:

<xsl:template match="products"> 
    <xsl:apply-templates select="product[prices/price/markup='100%']" mode="hundred"/> 
    <xsl:apply-templates select="product[prices/price/markup='80%']" mode="eighty"/> 
</xsl:template> 

<xsl:template match="product" mode="hundred"> 
    <xsl:element name="product"> 
    <xsl:attribute name="category"><xsl:value-of select="name" /></xsl:attribute> 
    <xsl:apply-templates select="prices/price[markup='100%']"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="product" mode="eighty"> 
    <xsl:element name="product"> 
    <xsl:attribute name="category"><xsl:value-of select="concat(name,'80')" /></xsl:attribute> 
    <xsl:apply-templates select="prices/price[markup='80%']"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="price"> 
    <!-- individual price processing here --> 
</xsl:template> 
+0

sacrément chaud, qui a parfaitement fonctionné! Merci d'avoir sauvé ma santé mentale! – pmn

Questions connexes