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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] exit <xsl:for-each> or ch, Jeni Tennison | Thread | RE: [xsl] problem with transforming, Michael Kay |
[xsl] exit <xsl:for-each> or change, Matts Isuls | Date | Re: [xsl] dynamically generate styl, Peter Davis |
Month |