xsl-list
[Top] [All Lists]

Re: [xsl] XSL comparing nodesets by name only

2010-11-15 08:56:30
On Mon, Nov 15, 2010 at 7:34 AM, Michael Kay <mike(_at_)saxonica(_dot_)com> 
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 :)

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--