[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] filter using contains with multiple values


Subject: Re: [xsl] filter using contains with multiple values
From: "Martin Honnen martin.honnen@xxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 4 Mar 2016 11:38:51 -0000

Raimund Kammering raimund.kammering@xxxxxxx wrote:
okay got that point (parenthesis). But still that does not work for me since somehow the string in filter_value is not understood as sequence!
So if I now use:

<xsl:if test="*[name()= $filter and . = $filter_value]b>

or as Michael suggested

<xsl:if test="*[name()= $filter][. = $filter_value]b>

it only matches the first of the two in the sequence if I use

<xsl:param name="filter_value" as="xs:string*" select="'Log', bInfo'b/>

to pass the parameter! Even an:

<xsl:value-of select=b$filter_valueb/>

only returns: bLogb where I would expect it to return the whole parameter! I seem to still miss some crucial point in making filter_value being understood as sequence here!?

Are you sure you are using an XSLT 2.0 processor with the
<xsl:stylesheet version="2.0"
? The xsl:value-of results sounds as if you have the wrong version attribute on your xsl:stylesheet or xsl:transform (or somewhere in your code you set xsl:version to 1.0).


For me

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">


<xsl:param name="filter" as="xs:string" select="'keyword'"/>
<xsl:param name="filter_values" as="xs:string*" select="'Log', 'Info'"/>

<xsl:template match="/">
    <xsl:copy-of select="//*[name() = $filter and . = $filter_values]"/>
</xsl:template>


</xsl:transform>


when run against

<list>
  <entry>
    <keyword>Log</keyword>
    <location>A</location>
  </entry>
  <entry>
    <keyword>Log</keyword>
    <location>B</location>
  </entry>
  <entry>
    <keyword>Problem</keyword>
    <location>A</location>
  </entry>
  <entry>
    <keyword>Info</keyword>
    <location>B</location>
  </entry>
</list>

with Saxon 9 (see online at http://xsltransform.net/gWvjQg1) returns the three elements

<keyword>Log</keyword><keyword>Log</keyword><keyword>Info</keyword>


The contains check with "some" would be


<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">


<xsl:param name="filter" as="xs:string" select="'keyword'"/>
<xsl:param name="filter_values" as="xs:string*" select="'Log', 'Info'"/>

<xsl:template match="/">
<xsl:copy-of select="//*[name() = $filter and (some $value in $filter_values satisfies contains(., $value))]"/>
</xsl:template>



</xsl:transform>


with the sample

<list>
  <entry>
    <keyword>Log</keyword>
    <location>A</location>
  </entry>
  <entry>
    <keyword>Log</keyword>
    <location>B</location>
  </entry>
  <entry>
    <keyword>Problem</keyword>
    <location>A</location>
  </entry>
  <entry>
    <keyword>The newest Info</keyword>
    <location>B</location>
  </entry>
</list>


giving


<keyword>Log</keyword><keyword>Log</keyword><keyword>The newest Info</keyword>

(Online at http://xsltransform.net/gWvjQg1/1)


Current Thread
Keywords