* Michael Kay
<snip>
Clearly the XSLT must be well-formed XML, so the closing tags have to be
properly nested, and they will then also be properly nested in the
result document. In fact, it's impossible to output a document in which
the tags aren't properly nested! So I don't think I understand the
question.
</snip>
Hi Micheal
I am being vague, because i don't understand all the issues - this is my first
transform. So
then, I don't think then I understand your second option then. This is the code that
i wrote below (Listing 1)
(Listing 1)
<?xml version="1.0"?>
<xsl:transform
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://www.elegalpublishing.com/namespace"
version="2.0"
exclude-result-prefixes="f xs">
<xsl:template match="Document/DocumentBody">
<REGULATION>
<xsl:for-each-group select="Paragraph"
group-starting-with="*[(_at_)StyleName='PART']">
<xsl:apply-templates select="."/>
</xsl:for-each-group>
</REGULATION>
</xsl:template>
<xsl:template match="Paragraph">
/* This is where opening ELEMENT should go EG. <PART> or
<DIVISION> */
/* and but where does the closing element go EG </PART> or
</DIVISION> */
<xsl:copy-of select="child::node()"/>
<xsl:for-each-group select="current-group() except ."
group-starting-with="*[(_at_)StyleName=f:child(@StyleName)]">
<xsl:apply-templates select="."/>
</xsl:for-each-group>
</xsl:template>
<xsl:function name="f:child">
<xsl:param name="level"/>
<xsl:choose>
<xsl:when test="$level='PART'">
DIVISION
</xsl:when>
<xsl:when test="$level='DIVISION'">
REGULATION
</xsl:when>
<xsl:when test="$level='REGULATION'">
SUB-REGULATION
</xsl:when>
</xsl:choose>
</xsl:function>
</xsl:transform>
Thanks
Mark Brand
Michael Kay wrote:
* Mark Brand
Hi
I have further questions on the fragments posted earlier. I
did try implementing both options
but had some questions ...
Q1.
<snip>
<xsl:for-each-group select="current-group() except "."
group-starting-with="*[(_at_)StyleName='DIVISION']">
</snip>
With this line of code, i found that it would execute (enter
the for-each-group
loop) even if there wasn't a DIVISION item in the group. How
do I stop the loop being entered if the group-starting-with
entry is not in the list. I have tried an if statement after
the loop has been entered but it is too late then for my purposes.
This reads to me like
<xsl:if test="current-group()/*[(_at_)StyleName='DIVISION']">
<xsl:for-each-group select="current-group() except "."
group-starting-with="*[(_at_)StyleName='DIVISION']">
...
</xsl:if>
But I may have misunderstood the requirement. What do you want to happen
if there isn't a DIVISION item in the group?
Q2.
<snip>
<Part Category="{(_at_)StyleName}">
<xsl:copy-of select="child::node()"/>
<xsl:for-each-group select="current-group() except ."
group-starting-with="*[(_at_)StyleName=f:child(@StyleName)]">
<xsl:apply-templates select="."/>
</snip>
With this piece of code from the second option where would
you put the closing tags,
where-ever i put them they would all output after everything
else instead of in a nested fashion.
Clearly the XSLT must be well-formed XML, so the closing tags have to be
properly nested, and they will then also be properly nested in the
result document. In fact, it's impossible to output a document in which
the tags aren't properly nested! So I don't think I understand the
question.
Michael Kay
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list