xsl-list
[Top] [All Lists]

Immediate uncle

2005-09-05 05:33:22
Hi

I have some XML which contains references to several types of images, and
one type in particular is defined in the following form:

------
<XML>
 ...
 <DIV>
  <IMAGE href="gif">
 </DIV>
 <Figure>Image caption</Figure>
 ...
</XML>
------

I am trying to refactor this XML so that for this kind of image the caption
becomes one of the attributes of the image, like so:

------
...
<screenshot source="gif" caption="Image caption" />
...
------

The stylesheet which I am using initially did something like this (ignoring
the caption for the moment):

------
<!-- IMAGE within its own DIV is a screenshot, otherwise an inline img -->
<xsl:template match="IMAGE">
  <xsl:choose>
    <xsl:when test="name(..)='DIV'">
      <screenshot>
        <xsl:attribute name="source">
          <xsl:value-of select="@href"/>
        </xsl:attribute>
      </screenshot>
    </xsl:when>
    <xsl:otherwise>
      <img>
        <xsl:attribute name="source">
          <xsl:value-of select="@href"/>
        </xsl:attribute>
      </img>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
------

To get the caption in there requires me to access the content of the first
following uncle of the context (IMAGE) node, provided that this uncle is a
"Figure".

I thought I could do this by making the following adjustment to the
<screenshot> section of the IMAGE template:

------
  <screenshot>
    <xsl:attribute name="source">
      <xsl:value-of select="@href"/>
    </xsl:attribute>
<!-- If a (DIV/IMAGE, Figure) combination then we have a caption -->
    <xsl:if test="..[following-sibling::*[1]][self::Figure]">
      <xsl:attribute name="caption">
        <xsl:value-of select="..[following-sibling::*[1]]" />
      </xsl:attribute>
    </xsl:if>
  </screenshot>
------

This fails, however, as the test is an invalid expression. I know that
  <xsl:if test="child::*[1][self::Figure]">
is valid because I use something equivalent to it elsewhere; thus I presume
that
  <xsl:if test=" following-sibling::*[1][self::Figure]">
would also be valid. So I presume the problem lies in trying to use that
entire expression as a predicate of the parent node? Is there a (better) way
to do what I am trying to do?

Thank you
Trevor


--~------------------------------------------------------------------
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>
--~--



<Prev in Thread] Current Thread [Next in Thread>