RE: [xsl] XPath expression confusion

Subject: RE: [xsl] XPath expression confusion
From: "Xia Li" <xli@xxxxxxxxxxxxx>
Date: Thu, 12 Jan 2006 14:53:01 -0800
I think you need to use

<xsl:when test="not(/system/components/component/requirement/@number=
.)">
	<requirement><xsl:value-of select="." /></requirement>
</xsl:when?

to look for the <number> element which no item in the sequence
"/system/components/component/requirement/@number" would match.

The <xsl:otherwise> in your style sheet is equivalent to the condition

<xsl:when test="/system/components/component/requirement/@number != .">

That means if there exists an item in the sequence selected by
"/system/components/component/requirement/@number" that is not equal to
the current value of <number> in the iteration, the condition is always
true. That is why you output all the value of <number> elements.


Lisa



-----Original Message-----
From: cknell@xxxxxxxxxx [mailto:cknell@xxxxxxxxxx]
Sent: Thursday, January 12, 2006 1:49 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: [xsl] XPath expression confusion

I have two files structured like this:

File A
-------
<requirements>
  <requirement>
    <number />
      <requirement>
        <number />
        And so on to an arbitrary depth
      </requirement>
  </requirement>
</requirements>

File B
-------
<system>
  <components>
    <component>
      <requirement number="" />
      <requirement number="" />
      <requirement number="" />
    </component>
  </components>
</system>

There will be an arbitrary number of components, each with an arbitrary
number of requirements.

My goal is to produce a document containing all the requirement/number
elements from File A that don't have a matching requirement/@number in
File B.

My unsuccessful approach is represented in this stylesheet fragment:

<xsl:variable name="all-reqs"
select="document('requirements.xml')/requirements//requirement/number"
/>

  <xsl:template match="/">
    <un-assigned-reqs>
      <xsl:for-each select="$all-reqs">
        <xsl:choose>
          <xsl:when
test="/system/components/component/requirement/@number = ." />
          <xsl:otherwise>
            <requirement><xsl:value-of select="." /></requirement>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
    </un-assigned-reqs>
  </xsl:template>

It was my belief that the XPath expression in the test would search all
the number attribute values in the document for a value that matched the
value of the current iteration of the loop.
Instead, it seems that there are no matches, as I get one element output
for each iteration of the loop.

Can someone point out where I'm going wrong?

Thanks.

--
Charles Knell
cknell@xxxxxxxxxx - email

Current Thread