[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Complex splitting of XML tag to multiple other XML tag
Hello XSLT experts!! We recieve XML files from one of our customers and then transform it into our own XML format using XSLT 1.0 (and Xalan 1.3), but we have a specific problem: ---------- We have the following DTD snippet (for the customer XML): <!ELEMENT ADLIST (head, lines)> <!ELEMENT head (#PCDATA)> <!ELEMENT lines (TeleLine, InetLine)+> <!ELEMENT TeleLine ( text1?, texte2? )> <!ELEMENT InetLine (#PCDATA)> <!ELEMENT text1 (#PCDATA)> <!ELEMENT text2 (#PCDATA)> In general we want to use XSLT to convert ONE <ADLIST> tag to ONE <AD> tag, where our own DTD for the <AD> tag is the following: <!ELEMENT AD (head?, lines)> <!ATTLIST AD SEQ CDATA (U|S|M|E) #REQUIRED> <!ELEMENT head (#PCDATA)> <!ELEMENT lines (TeleLine, InetLine)+> <!ELEMENT TeleLine ( text1?, texte2? )> <!ELEMENT InetLine (#PCDATA)> <!ELEMENT text1 (#PCDATA)> <!ELEMENT text2 (#PCDATA)> In doing the one-to-one conversion, we set the SEQ attribute to the value 'U' (undefined). The one-to-one conversion is NOT a problem! ---------- In certain circumstances we want to convert an <ADLIST> tag to several <AD> tags, using the SEQ attribute to reflect the sequence of the <AD> tags in relation to the original <ADLIST>. The semantics of this atrribute is 'S' for Start, 'M' for Middle and 'E' for End. The rules for splitting the original <ADLIST> tag into several <AD> tags, is as follows: 1) The <ADLIST> tag must contain: a) more than one <TeleLine> tag and at least one <InetLine> tag or b) more than one <InetLine> tag and at least one <TeleLine> tag 2) The <ADLIST> tag MUST contain a <TeleLine> tag that contains a <text1> tag and is NOT the first <TeleLine> tag. 3) The <ADLIST> tag must be split at <TeleLine> tags that contains an <text1> tag. When doing the split, we have to obey the following: i) The first <AD> tag contains at LEAST one <TeleLine> and at LEAST one <TeleLine>, NOT more than one of both. Furthermore only the first <AD> tag contains the <head> tag from the original XML and this <AD> tag should have the SEQ attribute set to 'S'. ii) The last <AD> tag contains the LAST <TeleLine> tag with a <text1> tag (and eventual <InetLine> and/or <TeleLine> with NO <text1> tag that follows). The last <AD> tag should have the SEQ attribute set to 'E'. iii) Medium <AD> tags (between the first and the last) should be generated for each NOT LAST <TeleLine> tags that contains a <text1> tag. These <AD> tags should have the SEQ attribute set to 'M'. ---------- Sometimes (maybe always) an example says more than a 1000 specification words, so heres an example: <ADLIST> <head>Head Text</head> <lines> <TeleLine> <text2>TTT1</text2> </TeleLine> <TeleLine> <text1>TTT2</text1> </TeleLine> <InetLine>III1</InetLine> <InetLine>III2</InetLine> <TeleLine> <text2>TTT3</text2> </TeleLine> <TeleLine> <text1>TTT4</text1> </TeleLine> <InetLine>III3</InetLine> <TeleLine> <text1>TTT5</text1> </TeleLine> <InetLine>III4</InetLine> <TeleLine> <text1>TTT6</text1> </TeleLine> <TeleLine> <text2>TTT7</text2> </TeleLine> </lines> </ADLIST> Should be converted to the following sequence of <AD> tags: <AD SEQ="S"> <head>Head Text</head> <lines> <TeleLine> <text2>TTT1</text2> </TeleLine> <TeleLine> <text1>TTT2</text1> </TeleLine> <InetLine>III1</InetLine> </lines> </AD> <AD SEQ="M"> <lines> <InetLine>III2</InetLine> <TeleLine> <text2>TTT3</text2> </TeleLine> <TeleLine> <text1>TTT4</text1> </TeleLine> </lines> </AD> <AD SEQ="M"> <lines> <InetLine>III3</InetLine> <TeleLine> <text1>TTT5</text1> </TeleLine> </lines> </AD> <AD SEQ="E"> <lines> <InetLine>III4</InetLine> <TeleLine> <text1>TTT6</text1> </TeleLine> <TeleLine> <text2>TTT7</text2> </TeleLine> </lines> </AD> ------- I suppose the solution requires some elaborate use of the <xsl:key> tag, but i just cant seem to figure it out (believe me - i have tried)! If anyone out there can help, i would REALLY appreciate it (and even buy that someone some excellent danish beer, if he or she should ever visit Aarhus in Denmark)! /Lars ** Stibo Graphic | Søren Nymarks Vej 21 | DK-8270 Højbjerg ** mailto:laes@xxxxxxxxx | http://www.stibographic.com ** Phone: +45 8939 8939 | Fax: +45 8939 8940 ** Direct: +45 8939 7421 XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|