Re: [xsl] Value of variable not appearing in the <xsl:otherwise> of xml:choose

Subject: Re: [xsl] Value of variable not appearing in the <xsl:otherwise> of xml:choose
From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 22 Sep 2021 02:19:21 -0000
Just replace the variable definition with this:

        <xsl:variable name="part3ID">
            <xsl:sequence select=
            "string(
                (current-group()[self::div[@class='analyze_visual']],
                 preceding-sibling::div[@class='analyze_visual'][1]
                )[1]/@nextExposID
                )"/>
        </xsl:variable>

The complete transformation becomes:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="div">
      <xsl:variable name="exploreExposID">
            <xsl:value-of select="@id"/>
      </xsl:variable>
      <div>
      <xsl:copy-of select="@*"/>
      <xsl:for-each-group select="*"
group-ending-with="div[@class='analyze_visual']">
        <xsl:variable name="part3ID">
            <xsl:sequence select=
            "string(
                (current-group()[self::div[@class='analyze_visual']],
                 preceding-sibling::div[@class='analyze_visual'][1]
                )[1]/@nextExposID
                )"/>
        </xsl:variable>
        <xsl:choose>
            <xsl:when
test="current-group()[self::div[@class='analyze_visual']]">
                <part num="1" globalNumn="{$exploreExposID}">
                    <xsl:copy-of
select="current-group()[not(self::div[@class='analyze_visual'])][not(self::h9
)]"/>
                </part>
                <part num="2" globalNum="{$part3ID}">
                    <xsl:copy-of
select="current-group()[self::div[@class='analyze_visual']]"></xsl:copy-of>
                </part>
            </xsl:when>
            <xsl:otherwise>
                <part num="3">
                    <xsl:attribute name="globalNum">
                        <xsl:value-of select="$part3ID"/>
                    </xsl:attribute>
                    <xsl:copy-of select="current-group()"/>
                </part>
            </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each-group>
      </div>
  </xsl:template>
</xsl:stylesheet>

And when applied on the provided XML document:
<div id="584175">
    <p>1.2 Modes</p>
    <p>Some content</p>
    <div class="analyze_visual" lookup="2.1.2.2" av_itemIDnum="584177"
nextExposID="584176">
        <p>Analyzing the Visual</p>
        <div class="av" type="analyze">
            <img alt="" src="http://assets.xxx.com/xxx.png"/>
            <p class="caption">Figure 2-2</p>
        </div>
    </div>
    <p>Ethics</p>
    <p>More content</p>
</div>

The wanted result is produced:

<div id="584175">
   <part num="1" globalNumn="584175">
      <p>1.2 Modes</p>
      <p>Some content</p>
   </part>
   <part num="2" globalNum="584176">
      <div class="analyze_visual" lookup="2.1.2.2" av_itemIDnum="584177"
           nextExposID="584176">
        <p>Analyzing the Visual</p>
        <div class="av" type="analyze">
            <img alt="" src="http://assets.xxx.com/xxx.png"/>
            <p class="caption">Figure 2-2</p>
        </div>
      </div>
   </part>
   <part num="3" globalNum="584176">
      <p>Ethics</p>
      <p>More content</p>
   </part>
</div>

Cheers,
Dimitre


On Tue, Sep 21, 2021 at 10:11 AM Terry Ofner tdofner@xxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> I have this xml input:
>
> <div id="584175">
>     <p>1.2 Modes</p>
>     <p>Some content</p>
>     <div class="analyze_visual" lookup="2.1.2.2" av_itemIDnum="584177"
nextExposID="584176">
>         <p>Analyzing the Visual</p>
>         <div class="av" type="analyze">
>             <img alt="" src="http://assets.xxx.com/xxx.png"/>
>             <p class="caption">Figure 2-2</p>
>         </div>
>     </div>
>     <p>Ethics</p>
>     <p>More content</p>
> </div>
>
>
> I need to divide it into three parts with any <div
class=banalyze_visualb> as the trigger:
>
> <div id="584175b>
>
>     <part num=b1b globalNum=b584175">
>         <p>1.2 Modes</p>
>         <p>Some content</p>
>     </part>
>
>     <part num="2">
>         <div class="analyze_visual" lookup="2.1.2.2" av_itemIDnum="584177"
nextExposID="584176">
>             <p>Analyzing the Visual</p>
>             <div class="av" type="analyze">
>                 <img alt="" src="http://assets.xxx.com/xxx.png"/>
>                 <p class="caption">Figure 2-2</p>
>             </div>
>         </div>
>     </part>
>
>     <part num="3" globalNum="584176">
>         <p>Ethics</p>
>         <p>more content</p>
>     </part>
>
> </div>
>
>
> I am using for-each-group()
group-ending-with=bdiv[@class=banalyze_visualb] to accomplish the
creation of the parts.
> The Issue: I am having trouble transferring the attribute nextExposID into
the third part. Here is the stylesheet:
>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>     xmlns:xs="http://www.w3.org/2001/XMLSchema";
>     xmlns:math="http://www.w3.org/2005/xpath-functions/math";
>     exclude-result-prefixes="xs math"
>     version="3.0">
>
> <xsl:template match="div">
>         <xsl:variable name="exploreExposID">
>             <xsl:value-of select="@id"/>
>         </xsl:variable>
>         <div>
>             <xsl:copy-of select="@*"/>
>     <xsl:for-each-group select="*"
group-ending-with="div[@class='analyze_visual']">
>         <xsl:variable name="part3ID">
>             <xsl:value-of
select="current-group()[self::div[@class='analyze_visual']]/@nextExposID"></x
sl:value-of>
>         </xsl:variable>
>         <xsl:choose>
>             <xsl:when
test="current-group()[self::div[@class='analyze_visual']]">
>                 <part num="1" globalNumn="{$exploreExposID}">
>                     <xsl:copy-of
select="current-group()[not(self::div[@class='analyze_visual'])][not(self::h9
)]"/>
>                 </part>
>                 <part num="2" globalNum="{$part3ID}">
>                     <xsl:copy-of
select="current-group()[self::div[@class='analyze_visual']]"></xsl:copy-of>
>                 </part>
>             </xsl:when>
>             <xsl:otherwise>
>                 <part num="3">
>                     <xsl:attribute name=bglobalNum">
>                         <xsl:value-of select="$part3ID"/>
>                     </xsl:attribute>
>                     <xsl:copy-of select="current-group()"/>
>                 </part>
>             </xsl:otherwise>
>         </xsl:choose>
>     </xsl:for-each-group>
>         </div>
>     </xsl:template>
>
> </xsl:stylesheet>
>
>
> Notice in the result below that the variable part3ID appears in part 2 just
fine, but it doesnbt display in part 3. I suspect this is due to the
<otherwise> of the xsl:choose. This seems strange to me, since I have declared
the variable outside the xsl:choose.
>
> My questions
> Is there a way to pass that variable to part 3?
> Or, is there a better way to create the parts I need?
>
> (I know that my numbering of the parts is clunky. I will address the
numbering to accommodate situations with more than one <div> after I solve
this issue.)
>
> Output modified slightly with returns to improve readability.
>
> <div id="584175b>
>
>    <part num="1" globalNumn="584175">
>       <p>1.2 Modes</p>
>       <p>Some content</p>
>    </part>
>
>    <part num="2" globalNum="584176">
>       <div class="analyze_visual"
>            lookup="2.1.2.2"
>            av_itemIDnum="584177"
>            nextExposID="584176">
>          <p>Analyzing the Visual</p>
>          <div class="av" type="analyze">
>             <img alt="" src="http://assets.xxx.com/xxx.png"/>
>             <p class="caption">Figure 2-2</p>
>          </div>
>       </div>
>    </part>
>
>    <part num="3" globalNum="">
>       <p>Ethics</p>
>       <p>More content</p>
>    </part>
>
> </div>
>
>
>
> XSL-List info and archive
> EasyUnsubscribe (by email)



--
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
To avoid situations in which you might make mistakes may be the
biggest mistake of all
------------------------------------
Quality means doing it right when no one is looking.
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play
-------------------------------------
To achieve the impossible dream, try going to sleep.
-------------------------------------
Facts do not cease to exist because they are ignored.
-------------------------------------
Typing monkeys will write all Shakespeare's works in 200yrs.Will they
write all patents, too? :)
-------------------------------------
Sanity is madness put to good use.
-------------------------------------
I finally figured out the only reason to be alive is to enjoy it.

Current Thread