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

Re: [xsl] XSL comparing nodesets by name only


Subject: Re: [xsl] XSL comparing nodesets by name only
From: Brandon Ibach <brandon.ibach@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 15 Nov 2010 09:56:13 -0500

On Mon, Nov 15, 2010 at 7:34 AM, Michael Kay <mike@xxxxxxxxxxxx> wrote:
>
>>  >
>>  >  I want to find out if the two nodesets share one or more elements. I
>>  >  only want a comparison regarding their nodenames not the values of
>>  >  the nodes.  In the above example $me1 and $me2 share the name of one
>>  >  element: and that is the element "<a/>". So my nodeset comparison
>>  >  should return "true".
>>
>> In XSLT 1.0:
>>
>>     <xsl:value-of select="name($me1) = name($me2)"/>
>
> Unfortunately, no. In XSLT 1.0, name($nodeset) returns the name of the
first
> item in the nodeset.
>
> I don't see any alternative to coding it as a nested loop

How about a for-each for the outer loop and a predicate instead of the
inner loop?

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:data="urn:data">
  <xsl:output method="text"/>

  <data:me1>
    <a></a>
    <b/>
  </data:me1>
  <data:me2>
    <a>value</a>
    <dd></dd>
  </data:me2>
  <xsl:variable name="me1" select="document('')/*/data:me1/*"/>
  <xsl:variable name="me2" select="document('')/*/data:me2/*"/>

  <xsl:template match="/">
    <xsl:variable name="matches">
      <xsl:for-each select="$me1">
        <xsl:if test="$me2[name(.) = name(current())]">
          <xsl:value-of select="concat(name(.), ',')"/>
        </xsl:if>
      </xsl:for-each>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="string($matches)">
        <xsl:text>Match on </xsl:text>
        <xsl:value-of select="substring-before($matches, ',')"/>
      </xsl:when>
      <xsl:otherwise>No match</xsl:otherwise>
    </xsl:choose>
    <xsl:text>&#10;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

-Brandon :)


Current Thread
Keywords