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>
indenter approprié et enlever les pièces non pertinentes serait vraiment aider à lire cette question et comprendre le problème. –
Vous avez raison, j'ai ajouté des retraits au document XML et décomposé la masse de XSLT. Merci pour la suggestion. – Navek
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. –