2010-11-09 16 views
0

Okay, j'ai atteint un bloc mental complet en essayant de faire marcher ça et je me demandais si quelqu'un d'autre pouvait être capable de contourner le problème. J'ai la structure suivante en HTML.Arrêter les doublons lors de la recherche de contains() dans XSLT

<?xml version="1.0" encoding="utf-8"?> 
    <root> 
     <listing> 
     <name>Frank Spencer</name> 
     <dob>2010-09-01</dob> 
     <details> 
     <firmname>Scotts</firmname> 
     <address>Blah Blah</address> 
     <businessname>Scotts</businessname> 
     <businessaddress>Blahdeblah</businessaddress> 
     </details> 
     <details> 
     <firmname>Scotts</firmname> 
     <address>Blah Blah</address> 
     <businessname>Wilson and Son</businessname> 
     <businessaddress>Blahdeblah</businessaddress> 
     </details> 
     <details> 
     <firmname>Wilson and Son</firmname> 
     <address>Blah Blah</address> 
     <businessname>Brudebakers</businessname> 
     <businessaddress>Blahdeblah</businessaddress> 
     </details> 
     <details> 
     <firmname>Carnage and Co.</firmname> 
     <address>Blah Blah</address> 
     <businessname>Brudebakers</businessname> 
     <businessaddress>Blahdeblah</businessaddress> 
     </details> 
    </listing> 
     <listing> 
     <name>Han Solo</name> 
     <dob>2010-09-01</dob> 
     <details> 
     <firmname>Independent trading</firmname> 
     <address>Blah Blah</address> 
     <businessname>Fugitive freight</businessname> 
     <businessaddress>Blahdeblah</businessaddress> 
     </details> 
     <details> 
     <firmname>Scotts</firmname> 
     <address>Blah Blah</address> 
     <businessname>Wilson and Son</businessname> 
     <businessaddress>Blahdeblah</businessaddress> 
     </details> 
     <details> 
     <firmname>Wilson and Son</firmname> 
     <address>Blah Blah</address> 
     <businessname>Scotts</businessname> 
     <businessaddress>Blahdeblah</businessaddress> 
     </details> 
     <details> 
     <firmname>Carnage and Co.</firmname> 
     <address>Blah Blah</address> 
     <businessname>Brudebakers</businessname> 
     <businessaddress>Blahdeblah</businessaddress> 
     </details> 
    </listing> 
</root> 

Avec le code XSLT suivant.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
<xsl:output method="html" indent="yes"/> 

<xsl:param name="searchName">Wilson</xsl:param> 
<xsl:param name="searchName2"></xsl:param> 

<xsl:variable name="Uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
<xsl:variable name="Lowercase" select="'abcdefghijklmnopqrstuvwxyz'"/> 

<xsl:template match="/"> 
    <xsl:for-each select="root/listing"> 
     <p>Name: <xsl:value-of select="name"/></p> 
     <p>DOB: <xsl:value-of select="dob" /></p> 

<xsl:for-each select="details[not(firmname=following::root/listing/details/firmname) and not(businessname=following::root/listing/details/businessname) or not(firmname=following::root/listing/details/businessname) or not(businessname=following::root/listing/details/firmname)]"> 

<xsl:choose> 

    <xsl:when test="contains(translate(firmname,$Uppercase,$Lowercase), translate($searchName,$Uppercase,$Lowercase)) and contains(translate(businessname,$Uppercase,$Lowercase), translate($searchName,$Uppercase,$Lowercase)) and not($searchName = '')"> 
(This individual has previously worked at: 
<xsl:value-of select="firmname" /> 
</xsl:when> 

<xsl:when test="contains(translate(businessname,$Uppercase,$Lowercase), translate($searchName,$Uppercase,$Lowercase)) and not(contains(translate(firmname,$Uppercase,$Lowercase), translate($searchName,$Uppercase,$Lowercase))) and not($searchName = '')"> 
(This individual has previously worked at: 
<xsl:value-of select="businessname" />) 
</xsl:when> 

<xsl:when test="contains(translate(firmname,$Uppercase,$Lowercase), translate($searchName,$Uppercase,$Lowercase)) and not(contains(translate(businessname,$Uppercase,$Lowercase), translate($searchName,$Uppercase,$Lowercase))) and not($searchName = '')"> 
(This individual has previously worked at: 
<xsl:value-of select="firmname" />)<br/> 
</xsl:when> 

</xsl:choose> 
</xsl:for-each> 
</xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

Ce que je veux, c'est obtenir une liste des entreprises qui contiennent le terme de recherche. Mais ce que je reçois est:

 
    Name: Frank Spencer 

    DOB: 2010-09-01 

    (This individual has previously worked at: Wilson and Son) 
    (This individual has previously worked at: Wilson and Son) 

    Name: Han Solo 

    DOB: 2010-09-01 

    (This individual has previously worked at: Wilson and Son) 
    (This individual has previously worked at: Wilson and Son) 

xslt devrait examiner à la fois firmname et businessname et si elle trouve une correspondance avec le contient, il doit imprimer une seule référence. Mais je n'arrive pas à le faire fonctionner. Quelqu'un at-il des solutions/suggestions? Le résultat idéal est.

<body> 
    <p>Name: Frank Spencer</p> 

    <p>DOB: 2010-09-01</p> 

    <p>(This individual has previously worked at: Wilson and Son)</p> 


    <p>Name: Han Solo</p> 

    <p>DOB: 2010-09-01</p> 

    <p>(This individual has previously worked at: Wilson and Son)</p> 
</body> 
+0

indenter approprié et enlever les pièces non pertinentes serait vraiment aider à lire cette question et comprendre le problème. –

+0

Vous avez raison, j'ai ajouté des retraits au document XML et décomposé la masse de XSLT. Merci pour la suggestion. – Navek

+0

Le regroupement avec XSLT 1.0 est expliqué ici: http://www.jenitennison.com/xslt/grouping/index.xml. Il peut également être utilisé pour éliminer les doublons. Pensez à publier un exemple d'entrée XML bien formé et la sortie HTML correspondante que vous souhaitez générer avec XSLT. –

Répondre

0

Est-ce que c'est ce que vous cherchez?

<xsl:param name="searchName">Brudebakers</xsl:param> 
<xsl:param name="searchName2"></xsl:param> 

<xsl:variable name="Uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
<xsl:variable name="Lowercase" select="'abcdefghijklmnopqrstuvwxyz'"/> 

<xsl:template match="/"> 
    <xsl:copy> 
     <body> 
      <xsl:apply-templates select="root/listing/name"/> 
     </body> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="name"> 
    <xsl:apply-templates select=". |following-sibling::dob" mode="fetch-value"/> 
    <xsl:apply-templates 
      select="following-sibling::details/businessname[contains(., $searchName)]" 
      mode="select-one"/> 
</xsl:template> 

<xsl:template match="node()[name() = 'businessname' or name() = 'firmname']" mode="select-one"> 
    <xsl:if test="not(../preceding-sibling::details/node()[(name() = 'businessname' or name() = 'firmname')][contains(., $searchName)])"> 
     <xsl:choose> 
      <xsl:when test="contains(., $searchName)"> 
       <xsl:apply-templates select="." mode="fetch-value"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:apply-templates select="./firmname" mode="select-one"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:if> 
</xsl:template> 


<xsl:template match="@*|node()" mode="fetch-value"> 
    <p> 
     <xsl:value-of select="."/> 
    </p> 
</xsl:template> 

Sortie:

<body> 
<p>Frank Spencer</p> 
<p>2010-09-01</p> 
<p>Brudebakers</p> 
<p>Han Solo</p> 
<p>2010-09-01</p> 
<p>Brudebakers</p> 
</body> 
+0

J'ai clarifié la question que j'ai posée. Les idées sont qu'il trouve la requête de recherche dans les deux firmname et businessname et puis sort seulement l'une des chaînes.Si vous changez searchName à quelque chose comme Brudebakers vous obtiendrez des doublons dans les résultats. – Navek

+0

@Navek, j'ai mis à jour ma solution. –

+0

Merci beaucoup Alex, je suis allé avec l'approche d'Alejandro à la fin, mais j'ai trouvé la tienne très intéressante aussi. – Navek

1

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:key name="kNamesByListingAndValue" match="firmname|businessname" 
      use="concat(generate-id(../..),'++',.)"/> 
    <xsl:param name="searchName" select="'Wilson'"/> 
    <xsl:variable name="Uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
    <xsl:variable name="Lowercase" select="'abcdefghijklmnopqrstuvwxyz'"/> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="root/listing 
              [details 
              [(firmname|businessname) 
              [contains(translate(
                  ., 
                  $Uppercase, 
                  $Lowercase), 
                 translate(
                  $searchName, 
                  $Uppercase, 
                  $Lowercase))]]]"/> 
    </xsl:template> 
    <xsl:template match="listing"> 
     <p> 
      <xsl:value-of select="concat('Name: ',name)"/> 
     </p> 
     <p> 
      <xsl:value-of select="concat('DOB: ',dob)" /> 
     </p> 
     <xsl:apply-templates 
      select="details[(firmname|businessname) 
           [contains(translate(., 
                $Uppercase, 
                $Lowercase), 
              translate($searchName, 
                $Uppercase, 
                $Lowercase))] 
           [count(.|key('kNamesByListingAndValue', 
              concat(generate-id(current()), 
                '++',.))[1])=1]]"/> 
    </xsl:template> 
    <xsl:template match="details"> 
     <span style="color:#626466;"> 
      <xsl:text>(This individual has previously worked at:&#160;</xsl:text> 
      <strong> 
       <xsl:value-of select="firmname" /> 
      </strong> 
      <xsl:text> [</xsl:text> 
      <i> 
       <xsl:value-of select="businessname" /> 
      </i> 
      <xsl:text>])</xsl:text> 
     </span> 
     <br/> 
    </xsl:template> 
</xsl:stylesheet> 

Sortie:

<p>Name: Frank Spencer</p> 
<p>DOB: 2010-09-01</p> 
<span style="color:#626466;">(This individual has previously worked at: <strong>Scotts</strong> [<i>Wilson and Son</i>])</span> 
<br /> 
<p>Name: Han Solo</p> 
<p>DOB: 2010-09-01</p> 
<span style="color:#626466;">(This individual has previously worked at: <strong>Scotts</strong> [<i>Wilson and Son</i>])</span> 
<br /> 

Rendus:

Nom: Frank Spencer

date de naissance: 2010-09-01

(Cette personne a déjà travaillé à: Scotts [ Wilson et Son])

Nom: Han Solo

date de naissance: 2010-09-01

(Cette personne a déjà travaillé à: Scotts [ Wilson et Son])

+0

Merci Alejandro, c'était très utile pour voir comment fonctionnent les touches. – Navek

+0

@Navek: Vous êtes bienvenu. Demander n'importe quand. –