[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] problem with transforming-copying same level elements - -2nd Posting--


Subject: RE: [xsl] problem with transforming-copying same level elements - -2nd Posting--
From: "Uslu, Cihan Y (MED)" <Cihan.Uslu@xxxxxxxxxx>
Date: Thu, 28 Mar 2002 08:45:27 -0600

Michael,
Thank you for you reply, I receive my input from FrameMaker to XML
conversion and I have no control over the input XML. Unfortunetly the
structure of XML is different than what you guessed. Tag <Body-Text> is
not parent to neither <answer> nor
<distractorList><distractor/></distractorList>, and there may be many
<question>, <answer/>, <distractorList><distractor/><distractorList>
combination after the tag <Body-Text> with the string value of... .
Having all the tags as siblings to each other makes it really hard for
me to group them under separate modules.
They're all at the same level. I'm using xalan for transformation, and
this XSL is being called by JSP page. After I transform the XML into
targeted XML structure then I convert it to EDI file and upload it into
a remote server for EDI processing.
I've appended my XSL script after the XML structure text, so you can
look at it and may be tell me what I need to do to make it work.

This is the input XML structure:
----------------------------------------------
<XML>
<stuff/> 
<Body-Text/><!-- This is my start point of Module One, and the
question,answer, and distractors of Module One--> 
<question/>  <!--first question -->
<answer/> 
<distarctorList>
	<distractor/>
</distractorList>
<question/> <!--second question -->
<distractorList>
	<distractor/>
	<distractor/>
</distractorList>
<answer/>
<distractorList>
	<distractor/>
</distractorList>
..... <!-- Other question, answer,distractors -->
<Body-Text> <!-- This is my start point for Module Two
<question/>  <!--first question-->
<answer/> 
<distarctorList>
	<distractor/>
</distractorList>
<question/> <!--second question -->
<distractorList>
	<distractor/>
	<distractor/>
</distractorList>
<answer/>
<distractorList>
	<distractor/>
</distractorList>
<stuff/>
</XML>


This is the XSL script I'm working on it, it works up o assessment
level, where I am able to copy the question and its content into
assessment. For answer and distractors, I've tried every other way but
no luck, I can not get them under assessment and group them.

-------------------------------------
<xsl:template match="XML">
<xsl:element name="course">
 	<xsl:attribute name="courseNum">
		<xsl:value-of
select="normalize-space(.//courseNum/text())"/> <!-- There is only one
courseNum element, that's why this selection is gloabl-->
	</xsl:attribute>
 	<xsl:attribute name="owner">
 		<xsl:value-of select="''"/>
 	</xsl:attribute>
 	<xsl:attribute name="ownerEmail">
 		<xsl:value-of select="''"/>
 	</xsl:attribute>
    <xsl:for-each select="Body-Text[contains(.,'To be eligible for CE
credit')]">
   		<xsl:if test="count(preceding-sibling::Body-Text[text()
= current()/text()]) =0">
               <xsl:element name="module">
             		<xsl:attribute
name="test-type">S</xsl:attribute>
					<xsl:attribute
name="show-test-feedback">N</xsl:attribute>
					<xsl:attribute
name="allow-test-review">Y</xsl:attribute>
					<xsl:attribute
name="required">Y</xsl:attribute>
					<xsl:attribute
name="content">Click CONTINUE to begin the assessment.</xsl:attribute>
					<xsl:attribute
name="passing-score">0</xsl:attribute>
					<xsl:attribute
name="test-out-score">0</xsl:attribute>
					<xsl:element name="title">
						<xsl:element
name="para">Pre-Assessment</xsl:element>
    					</xsl:element>
	       	 		<xsl:element name="intro">
	        			<xsl:element name="para">This is
the pre-program assessment test for
	        				<xsl:value-of
select="$title"/>. Please click CONTINUE to proceed.
	        			</xsl:element>
	       		 	</xsl:element>
         		   <xsl:for-each
select="following-sibling::*/self::question">
         		   	<xsl:if
test="count(preceding-sibling::Body-Text[text() =
preceding-sibling::*/text()]) =0">
         		   		<xsl:element name="assessment">
         		   			<xsl:element
name="question">
         		   				<xsl:element
name="stem">
 
<xsl:element name="para">
 
<xsl:copy-of select="* | text()"/>
 
</xsl:element>
         		   				</xsl:element>

         		   			</xsl:element>
         		   		</xsl:element>
         		   	</xsl:if>
         		   </xsl:for-each>
                     <!-- I need to do something here for the answers
and distractors-->
  		</xsl:element>
       </xsl:if>
      <xsl:if test="count(preceding-sibling::Body-Text[text() =
current()/text()]) =1">
			<xsl:element name="module">
             	<xsl:attribute name="test-type">P</xsl:attribute>
				<xsl:attribute
name="required">Y</xsl:attribute>
				<xsl:attribute name="content">Click
CONTINUE to begin the assessment.</xsl:attribute>
    			<xsl:attribute
name="test-out-score">0</xsl:attribute>
				<xsl:element name="title">
					<xsl:element
name="para">Post-Assessment</xsl:element>
    			</xsl:element>
	       	 	<xsl:element name="intro">
	        		<xsl:element name="para">This is the
post-program assessment test for
	        			<xsl:value-of select="$title"/>.
Please do not complete the assessment until after you have viewed the
TiP broadcast. When you are ready to take the assessment, click CONTINUE
to proceed.
	        		</xsl:element>
	       		 </xsl:element>
                 <xsl:for-each
select="following-sibling::*/self::question">
    				<xsl:if
test="count(preceding-sibling::Body-Text[text() =
preceding-sibling::*/text()]) =1">
    				<xsl:element
name="assessment"></xsl:element>
    				</xsl:if>
    			</xsl:for-each>
  			</xsl:element>
     	</xsl:if>
	</xsl:for-each>
</xsl:element>
</xsl:template>


-----Original Message-----
From: Michael Kay [mailto:michael.h.kay@xxxxxxxxxxxx]
Sent: Thursday, March 28, 2002 3:42 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: RE: [xsl] problem with transforming-copying same level elements
--2nd Posting--


> For each <Body-Text> tag with string value of "To be eligible for CE
> credit", I need to create a <module> element and for each
> <question> tag
> create a child element named <assessment> and copy the xml/question,
> xml/answer and distractorList/distractor and their contents
> as childs of <assessment> tag.
>
Minor point, you shouldn't be using "<XML>" as an element name. It's
reserved.

In your example each Body-Text contains exactly one question and one
answer?
If that's always true, then it's easy. I'm guessing that the real
structure
is:

<body-text>
  <question/>
  <xxx/>
  <answer/>
  <xxx/>
  <question/>
  <xxx/>
  <answer/>
  <xxx/>
  <question/>
  <xxx/>
  <answer/>
  <xxx/>
</body-text>

This is a particularly knotty kind of grouping transformation. It's easy
in
XSLT 2.0 (you can try this with Saxon 7.0):

<xsl:for-each-group group-starting-at="question">
<assessment>
  <question><xsl:value-of select="current-group()/question"/></question>
  <answer><xsl:value-of select="current-group()/question"/></answer>
</assessment>

It's harder with XSLT 1.0, but by no means impossible. I would do it
along
the following lines:

<xsl:template match="Body-Text[.='.....']">
<module>
<xsl:apply-templates select="question[1]"/>
</module>
</xsl:template>

<xsl:template match="question">
<assessment>
  <question><xsl:value-of select="."/></question>
  <answer><xsl:value-of select="following-sibling::answer[1]"/></answer>
<assessment
<xsl:apply-templates select="following-sibling::question[1]"/>
</xsl:template>

I'm afraid I've abstracted from the detail of your actual input and
output
here, you'll have to sort out the detail yourself. The <distraction>
elements might make the detail a fair bit more complicated than this;
the
trick is to select those <distraction> elements whose
preceding-sibling::question[1] is the current question, which you can
test
using generate-id().

Michael Kay
Software AG
home: Michael.H.Kay@xxxxxxxxxxxx
work: Michael.Kay@xxxxxxxxxxxxxx

>
> TARGETED XML
> --------------------------
> <course>
> <module>
> 	<assessment>
> 		<question>
> 		   <stem>
> 			<para>some text here</para>
> 		</stem>
> 		<answer> This is answer</answer>
> 		<distractor> This is distractor 1</distractor>
> 		<distractor> This is distractor 2</distractor>
> 		</question>
> 	</assessment>
> 	.....
> </module>
> <module>
> 	<assessment>
> 		<question>
> 		   <stem>
> 			<para>some more text here</para>
> 		</stem>
> 		<distractor> This is another distractor 1</distractor>
> 		<answer>This is another answer</answer>
> 		<distractor> This is another distractor 2</distractor>
> 		<distractor> This is another distractor 3</distractor>
> 		</question>
> 	</assessment>
> 	.....
> </module>
> </course>
>
>
>
>
> INPUT XML
> -------------
> <XML>
> <Body-Text>To be eligible for CE credit</Body-Text>
> <question>some text here</question>
> <distractorList>
> 	<distractor>This is distractor 1</distractor>
> </distractorList>
> <answer>This is answer</answer>
> <distractorList>
> 	<distractor>This is distractor 2</distractor>
> 	<distractor>This is distractor 3</distractor>
> </distractorList>
> ......
> <Body-Text>To be eligible for CE credit</Body-Text>
> <question>some more text here</question>
> <distractorList>
> 	<distractor> This is another Distractor 1</distractor>
> </distractorList>
> <answer>This is another answer</answer>
> <distractorList>
> 	<distractor>This is another Distractor 2</distractor>
> 	<distractor>This is another Distractor 3</distractor>
> </distractorList>
> </XML>
>
>
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



Current Thread
Keywords