"Unwrap" CDATA with XSLT

Hi,
I know this isn't necessarily a FrameMaker question, but it is a place where I know people. So forgive me for asking it here.
I have some CDATA sections in an XML file that contain markup that I want to be parsed eventually, and I want to be able to extract it with the markup intact. Can I do this with XSLT, or does the nature of CDATA negate the use of retrieving the markup with an XML-parser-dependent technology?
Here's a sample element (element tags replaced with curly braces)
{documentation}{![CDATA[{p}Some text{/p}]]}{/documentation}
Is there any way I can get that p element out of there with XSLT, without excaping any of the characters, so it is parsable markup in the output?
[{p}Some text{/p}
Thanks,
Russ

Russ,
Two XSLT 1.0 attributes that might allow you to accomplish what you want are:
<xsl:output cdata-section-elements="documentation">
This XSLT element tells the XSLT processor to always output text nodes within documentation elements as CDATA sections. Hence, with this
<xsl:output> element and the template:
<xsl:template match="documentation">
  <xsl:copy>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template
your original example would be output as itself:
<documentation><![CDATA[<p>Some text</p>]]></documentation>
It gets more complicated if you want to illustrate CDATA sections in your documentation element.
<xsl:value-of disable-output-escaping="yes">
tells the processor to output those special characters that are interpreted by an XML parser as themselves instead of as one of the XML representations of those characters. Thus, you can try:
<xsl:template match="documentation">
  <xsl:copy>
    <xsl:value-of disable-output-escaping="yes" select="."/>
  </xsl:copy>
</xsl:template
--Lynne

Similar Messages

  • Possible with XSLT mapping?

    Hi,
    I have source xml structure of format
    <Header fld1 fld2 fld3
    fld4 fld5 fld6  ><line   fld7 fld8 fld9 </line></header>
    Header occurence is 1---unbounded
    and line occurence is 0---unbounded
    and line items can exist or not for some header items.for some headers items can be single or multiple.
    I get xml files on sender side and need to convert to flat files ,so I am using sender file CC on sender and receiver file CC with FCC on the receiver side.
    I am able to get with receiver file FCC ,I know FCC can support two level heirarchies only.
    header1
    header2
    header3
    header n
    line x
    line y
    line z
    line n
    so i dont know to which header values the item values belong to.I need to get
    this structure
    header1....(if no items)
    header2....(let say 2 items)
    linex
    liney
    header3...(no items)
    header4....(one item)
    linez
    header n.....(again no items)
    so I have another Xi guy,he told me that we can achieve this by using a XSLT mapping rather than gaphical mapping which I am using now.
    so can we get the structure what I wanted with XSLT mapping or is it nothing with mapping and it is with adapter?(I think its nothing with mapping)
    I know we may get the required output structure by writing a module program and call that in the receiver file adapter.
    suggestions please.
    thank you,
    regards,
    Babu

    udo,
    sorry if I put in confusion with my structures of both source and target.I am trying to give little eloberate
    I have source  xml data like this.
    <Header1 fld1=1234 fld2="name1" fld3='SAP1"
    fld4='000" fld5=0 fld6="sdn1"</header>...............no line items here
    <Header2 fld1=123 fld2="name" fld3='SAP"
    fld4='00" fld5=0 fld6="sdn" ><line fld7=value1 fld8=value2 fld9=value3 /line><line fld7=value4 fld8=value5 fld9=value6 /line></header>.....two line items here
    <Header3 fld1=123 fld2="name" fld3='SAP"
    fld4='00" fld5=0 fld6="sdn" ><line fld7=value7 fld8=value8 fld9=value9 /line></header>......one line item here
    Header4 fld1=12345 fld2="name2" fld3='SAP2"
    fld4='0006" fld5=01 fld6="sdn2"</header>.......no line items here
    I want target flat file structure like this considering "~" (tild)as delimiter
    1234name1SAP100000~sdn1 ...................> flatfile values for header1(no item values for this header1)
    123nameSAP000~sdn..........................> flat file values for hader2
    value1value2value3...........................>line item values for header2
    value4value5value6...........................>line item values for header2(two line item values for this header2)   
    123nameSAP000~sdn..........................>values for hader3
    value7value8value9...........................>line item values for header3(one item values for this header3)
    12345name2SAP2000601~sdn2..................>values for header4(no item values for this header4)
    ................... like for n header values.

  • Using transform api with xslt and DOM Nodes

    Hi,
    when trying to transform a xml document with xslt using the javax.xml.transform api
    providing an element node of a previously parsed document, I find that absolute
    paths are not recognized.
    The following program shows what I am basically doing (the class can be executed
    on the command line providing a stylesheet and xml instance):
    import java.io.*;
    import org.w3c.dom.*;
    import javax.xml.transform.*;
    import javax.xml.transform.dom.*;
    import javax.xml.transform.stream.*;
    import javax.xml.parsers.*;
    class Transform {
    public static void main(String [] args) throws Exception {
         TransformerFactory tfactory = TransformerFactory.newInstance();
         Transformer transformer = tfactory.newTransformer(new StreamSource(args[0]));
         DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder parser = dfactory.newDocumentBuilder();
         Document doc = parser.parse(args[1]);
         Element domElem = doc.getDocumentElement();
         // workaround
    //     StringWriter out = new StringWriter();
    //     Transformer id = tfactory.newTransformer();
    //     id.transform(new DOMSource(domElem),new StreamResult(out));
    //     String xml = out.toString();
    //     transformer.transform(new StreamSource(new StringReader(xml)), new StreamResult(System.out));
         transformer.transform(new DOMSource(domElem), new StreamResult(System.out));
    transformer.clearParameters();
    If I use this on e.g.
    xsl:
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" encoding="ISO-8859-1" method="xml"/>
    <xsl:template match="/">
    <xsl:value-of select="/foo/bar"/>
    </xsl:template>
    </xsl:stylesheet>
    xml:
    <foo>abc<bar>def</bar></foo>
    I get
    <?xml version="1.0" encoding="ISO-8859-1"?>
    abcdef
    instead of
    <?xml version="1.0" encoding="ISO-8859-1"?>
    def
    I think this is due to the fact, that the transformation does not recognize
    any absolutely adressed xpath correctly.
    From what I read in the API docs, I think what I'm doing should be ok.
    So: did I misunderstand something or is this a bug in the java libraries?
    I'm using j2sdk 1.4.1_01 on i386 linux.
    If I use the commented code (serializing the xml and doing the transformation
    with a StreamSource, that has to be parsed again), everything's fine.
    Of course it would be easier to parse the file directly in the example but in the
    real program, I already have a dom tree and want to transform a part of it.
    Any help appreciated.
    Thanks, Morus

    why?
    that's all the point of XSL: define what part of your
    XML you want in your XSL templates, there is no need
    to prepare a sub-DOM of your DOM.
    Ok. Right. That's an alternative.
    The problem remains, that there are some stylesheets originally written
    for the current solution and though they should work with the whole document
    as well, it's not certain.
    Actually I don't know if this ever worked. I did neither write this code nor maintained the system so far.
    btw. you would be faster by giving a StreamSource to
    your transformation.Probably yes. But that would imply to rewrite a lot of code.
    What is happening is:
    there is a SOAP answser containing a xml document as the result parameter.
    The SOAP answer is parsed (I guess by the soap classes already) and the
    result xml is extracted. That's where the element node I'm trying to transform
    stems from.
    Besides, I still don't see why DOMSource takes any node if only document nodes
    work.
    Thanks, Morus

  • Issue with xslt transform

    I'm having a problem with xslt transformations.
    I'm sending a DOMDocument to be transformed into a varchar2. The transformation was into html and I was then printing the returning varchar2 to a web page, along the lines of...
    htp.prn(Xslt.transform(domdoc, xslt.stylesheet( l_stylesheet_bfile)));
    I subsequently broke the varchar2 32k limit so I started playing with transforming into a dom instead of a varchar, then writing the dom to a clob and the printing the clob to the web page in 32k chunks.
    I noticed this produced different results than the first method. Now I'm assuming that this is not because xslt is doing the transformations differently but because it's trying to put my html into a well-formed DOMdocument. I have noticed, though, that things like & #160; seemed to have disappeared.
    Just wondering if I'm doing something wrong, and also any reason why the transform functionality doesn't have an output option of CLOB?
    Thanks
    Jason

    What is the DB version?

  • Using Starts-with XSLT function with XI

    Hi All,
    Any help is apperciated. I am using the starts-with xslt function and when i do so the message gets stucks in the queue. If i run code without the starts-with then is works??
    <xsl:for-each select="receipt/prod">
         <xsl:for-each select="carrier/carrier_detail/carrier">
               <xsl:choose>
                   <xsl:when test="carrier_type='CASE'">
                        <xsl:choose>
                             <xsl:when test="starts-with(carrier_barcode, '00')">
                                                   do something
                                            </xsl:when>
                                           <otherwise>
                                                 do something
                                           </otherwise>
    so on..
    when i try to process messsage using this xslt format it gets sysfail in the queue, but without it, it works fine.
    I need to a special format if the condition of barcode starts with 00

    Chirag,
    Create xslt on abap mapping using transaction SXLT_TOOL on XI abap stack. Copy paste same xslt code and run with test file. You can debug code or most likely you can see error message too.
    Actually your mapping raising an exception which result in sys-fail.
    Hope this will help.
    Nilesh

  • Problem with portlets with XSLT generating dynamic portal compatible links

    Hi,
    We're using XSLT to transform XML data to HTML in a portlet. The problem is that
    the XML contains headlines and we need to create links to the complete article,
    which has to be displayed in the same portlet. How do I create a portal comaptible
    link with XSLT? In the JSP you can use the netui tag library like:
    <netui:anchor action="..">
    link
    <netui:parameter name="id" value="{id}"/>
    </netui:anchor>
    but how can I achieve this with XSLT? We tried generating the xsl with a jsp,
    but this doesn't work since the data entered in the value attribute of the netui:parameter
    tag will be encoded causing the XSL transformer to fail.
    Is there an easy solution to this? Or can XSLT only be used with very simple content?
    Ard

    We're trying to display some news headlines, clicking a headline has to invoke
    an action to display the complete article in the same portlet (using pageflow).
    When displaying the articles we use XSLT like (this is a JSP generating XSLT):
    <?xml version="1.0"?>
    <%@ page contentType="text/x-xslt"%>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
    <xsl:template match="items">
    <xsl:apply-templates select="item"/>
    </xsl:template>
    <xsl:template match="item">
    <nobr>
    <%-- ###### Here we need an action link, with the title as a request parameter
    ###### --%>
    <xsl:value-of select="@title"/>
    </nobr>
    </xsl:template>
    </xsl:stylesheet>
    The XML is like:
    <items>
    <item title="some title"/>
    <item title="some other title"/>
    </items>
    We need to generate a portal compatible link which invokes an action (show_details)
    with the title of the article as a request parameter.
    I know how to do this in a JSP, but since the data is in XML we like to do this
    with XSLT.
    Can you help?
    Subbu Allamaraju <subbuATBeaDOTCom> wrote:
    Could you elaborate (perhaps with some xsl snippet generated by jsp)
    the
    failures you were getting with xslt?
    Subbu
    Ard van der Scheer wrote:
    Hi,
    We're using XSLT to transform XML data to HTML in a portlet. The problemis that
    the XML contains headlines and we need to create links to the completearticle,
    which has to be displayed in the same portlet. How do I create a portalcomaptible
    link with XSLT? In the JSP you can use the netui tag library like:
    <netui:anchor action="..">
    link
    <netui:parameter name="id" value="{id}"/>
    </netui:anchor>
    but how can I achieve this with XSLT? We tried generating the xsl witha jsp,
    but this doesn't work since the data entered in the value attributeof the netui:parameter
    tag will be encoded causing the XSL transformer to fail.
    Is there an easy solution to this? Or can XSLT only be used with verysimple content?
    Ard

  • Change a attribute value with XSLT before importing an XML

    I need change the attribute value with XSLT before importing an XML
    <table class="x" style="width="50pt">...
    I have to divide by 200 the value of "width", and the result multiplied by 100:
    (50/200) * 100
    It's possible with a XLST?

    Hi,
    Yes you can do this via XSLT.
    You can try similar to the one below:
    <table>
       <xsl:attribute name="width">
         <xsl:value-of select="((./width) div 200)*(100)" />
       </xsl:attribute>
    </table>
    I have not tested yet... Try it....
    Green4ever
    (I am back after long time)....

  • Unable to refer to custom resource bundle in WPC content rendered with xslt

    Hi,
    I need to use the resource bundle messages inside WPC content.
    When rendered by standard xsl templates the  call to XSLTHelper class is done to retrieve message from the standard SAP resource bundle com.sap.nw.wpc.bundles.core.properties, like this:
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                         xmlns:wpc="com.sap.nw.wpc.km.service.editor.hslt.XsltHelperCore">
    <xsl:value-of select="wpc:getString([key defined in sap bundle], string(/document/@locale))"/>
    The problem is that helper class doesn't provide any API to use custom bundles.
    I tried to create xslt helper (including config in KM), but that didn't succeed neither. It would return with error NoClassDefFound.
    Could you please help on configuring xslt helper and registering it with xslt rendering engine for Web Page Composer? I could not find any how-to guides on xslt helpers for WPC.
    Thanks in advance.
    Ruslan

    Hi
    Did you find a solution?
    Christof

  • How to export string in CDATA with the jaxb xml writer?

    How to export string in CDATA with the jaxb xml writer?
    It read CDATA no problem but it is lost on write.

    Found it:
    ### THIS WORKS WITH SUN JAXB REFERENCE IMPLEMENTATION. ###
    (Not tested with any other)
    In the xsd, you must create a type for your string-like element.
    Then associate a data type converter class to this new type, which will produce CDATA tags.
    Then you must set a custom characterEscapeHandler to avoid the default xml escaping in order to preserve the previously produced CDATA tag.
    Good luck.
    -----type converter-----
    import javax.xml.bind.DatatypeConverter;
    public class ExpressionConverter {
         * Convert an expression from an XML file into an internal representation. JAXB will
         * probably have already stripped off the CDATA encapsulation. As a result, this method
         * simply invokes the JAXB type conversion for strings but does not take any other action.
         * @param text an XML-compliant expression
         * @return a pure string expression
         public static String parse(String text) {
              String result = DatatypeConverter.parseString(text);
              return result;
         * Convert an expression from its internal representation to an XML-compliant version.
         * This method will simply surround the string in a CDATA block and return the result.
         * @param text a pure string expression
         * @return the expression encapsulated within a CDATA block
         public static String print(String text) {
              StringBuffer sb = new StringBuffer(text.length() + 20); //should add the length of the CDATA tags + 8 EOLs to be safe
              sb.append("<![CDATA[");
              sb.append(wrapLines(text, 80));
              sb.append("]]>");
              return DatatypeConverter.printString(sb.toString());
         * Provides line-wrapping for long text strings. EOL indicators are inserted at
         * word boundaries once a specified line-length has been exceeded.
         * @param text the string to be wrapped
         * @param lineLength the maximum number of characters that should be included in a single line
         * @return the new string with appropriate EOL insertions
         private static String wrapLines(String text, int lineLength) {
              //wrap logic, watchout for quoted strings!!!!
              return text;
    ------in caller----
    Marshaller writer = ......
    writer.setProperty("com.sun.xml.bind.characterEscapeHandler", new NoCharacterEscapeHandler());
    -----escaper-----
    import java.io.IOException;
    import java.io.Writer;
    import com.sun.xml.bind.marshaller.CharacterEscapeHandler;
    public class NoCharacterEscapeHandler implements CharacterEscapeHandler {
         * Escape characters inside the buffer and send the output to the writer.
         * @param buf buffer of characters to be encoded
         * @param start the index position of the first character that should be encoded
         * @param len the number of characters that should be encoded
         * @param isAttValue true, if the buffer represents an XML tag attribute
         * @param out the output stream
         * @throws IOException if the writing process fails
         public void escape(char[] buf, int start, int len, boolean isAttValue, Writer out) throws IOException {
              for (int i = start; i < start + len; i++) {
                   char ch = buf;
                   if (isAttValue) {
                        // isAttValue is set to true when the marshaller is processing
                        // attribute values. Inside attribute values, there are more
                        // things you need to escape, usually.
                        if (ch == '&') {
                             out.write("&");
                        } else if (ch == '>') {
                             out.write(">");
                        } else if (ch == '<') {
                             out.write("<");
                        } else if (ch == '"') {
                             out.write(""");
                        } else if (ch == '\'') {
                             out.write("&apos;");
                        } else if (ch > 0x7F) {
                             // escape everything above ASCII to &#xXXXX;
                             out.write("&#x");
                             out.write(Integer.toHexString(ch));
                             out.write(";");
                        } else {
                             out.write(ch);
                   } else {
                        out.write(ch);
              return;

  • Target XML attribute with XSLT

    Hello,<br />I have an xml file which looks like this:<br /><br /><PRODUCTS><br /><PRODUCT><br /><IMAGE href="file://./0001.tif"></IMAGE><br /></PRODUCT><br /><PRODUCT><br /><PRODUCTS><br /><br />Is there a way to target the href attribute of the PRODUCT element with XSLT?<br /><br />Thanks

    hi marco,
    > Thank you gregor, I'll take a look to this reference; I'm total newby to
    > XSLT, so any suggestions would be surely fine.. another question: do you
    > think it's better to work with XSLT or XmlRules?
    there is no short answer on this. it depends on your documents/data you
    want to process, what to achieve and you're knowledge in scripting vs.
    xslt. i use xmlRules for styling my documents, xslt for data transformation.
    in general you've got more control, especially over the rendered
    document, using xmlRules. if you want to process layout rules/guidelines
    in dependency of the actual document you have to render it first.
    complex data transformation and composition is better with xslt outside
    of indesign. i prefer to prepare my data (select relevant data,
    numbering, ...) with xslt.
    cheers,
    gregor

  • Can SAX be used with XSLT

    I'm having Java memory problems with 8.1.7 when using a large
    XML file and creating a XML DOM. One solution I may have found
    is to use SAX which will create seperate trees for each
    ROWSET/ROW instead of building the entire tree in memory like
    DOM. But I can't figure out how to use SAX with XSLT. I want
    each record written to the same text file using a XSLT
    template. Anyone know how to do this?

    The solution can be found in the XMLLoader application written
    by Steven Muench, in his book "Building Oracle XML
    Applications". It is also somewhere online under the book's
    O'Reilly pages but I don't have the exact URL.
    The solution is basically that the SAX model is used to parse
    the large file and build a DOM tree as each node is
    encountered. When the SAX model detects the closing tag of a
    subdocument (probably what would be in your <ROWSET></ROWSET>
    tags) then the current DOM tree is used to perform the proper
    database operation. Then the SAX parser goes on with life until
    it finds the next complete subdocument, etc. Pretty slick.
    XMLLoader takes as an argument, the stylesheet you want to apply
    to the data, so you can transform your XML data into something
    that now has the Oracle canonical format on the fly.
    There are numerous posts in this newsgroup regarding XMLLoader,
    and Muench regularly answers questions here as well.
    Good luck!
    Mike

  • Any way to generate a single quote (') with XSLT?

    Hi:
    I guess this is really an XSLT question. I'm using the Transform() method of an XMLType variable to apply a style sheet. The XML in the variable is just something simple like
    <TBL>
    <LAST_NAME>LIKE|JONES</LAST_NAME>
    <FIRST_NAME>=|MARY</FIRST_NAME>
    <AGE>=|50</AGE>
    </TBL>
    I am trying to get a stylesheet to transform something like the above into SQL such as
    Select * from foo where LAST_NAME like 'JONES'
    and FIRST_NAME ='MARY'
    and AGE = 50But to do this, I need to generate the single quotes around the search terms and I can't get anything but LAST_NAME LIKE &apos;JONES&apos;. Is there a way to do this? For now I am generating a ~ and replacing ~ for ' throughout the generated SQL text but that's a pretty sorry solution.
    I thought that something like <xsl:text disable-output-escaping="yes">&amp;</xsl:text> was going to work but then found out it has been deprecated. I was thinking character-map might work but that's an XSLT 2.0 thing and apparently 10g is on XSLT 1.0? In any case, it had no idea what I was trying to do with a character map.
    So, am I overlooking an obvious way to get my stylesheet to insert apostrophes?
    Thanks.

    It's 10.2.0.4.
    Here's the procedure that accepts the XML/XSL clobs and tries to produce a SQL statement.
    PROCEDURE GetSQLQueryFromXML(XMLClob in CLOB, XSLStylesheet in CLOB,
                SQLQuery out CLOB, status out integer) IS
        -- Define the local variables
      xmldata               XMLType;  -- The XMLType format of the XML to transform
      xsldata               XMLType;  -- The XMLType format of the stylesheet to apply
      sqlQuery_XMLType      XMLType;  -- The XMLType format of the SQL query.
      v_SQLQuery            Clob;     -- Holds XML Clob before translating ~ to '
    BEGIN
    status := -1;  -- Initially unsuccessful
      -- Get the XML document using the getXML() function defined in the database.
      -- Since XMLType.transform() method takes XML data as XMLType instance,
      -- use the XMLType.createXML method to convert the XML content received
      -- as CLOB into an XMLType instance.
      xmldata := XMLType.createXML(XMLClob);
      -- Get the XSL Stylesheet using the getXSL() function defined in the database.
      -- Since XMLType.transform() method takes an XSL stylesheet as XMLType instance,
      -- use the XMLType.createXML method to convert the XSL content received as CLOB
      -- into an XMLType instance.
      xsldata := XMLType.createXML(XSLStylesheet);
      -- Use the XMLtype.transform() function to get the transformed XML instance.
      -- This function applies the stylesheet to the XML document and returns a transformed
      -- XML instance.
      sqlQuery_XMLType := xmldata.transform(xsldata);
      -- Return the transformed XML instance as a CLOB value.   
      v_SQLQuery := sqlQuery_XMLType.getClobVal();
      -- Change tildas to apostrophes.  Currently unable to get an XSLT transformation
      -- to insert single quotes, so we're inserting ~ instead.  Now we need to
      -- translate all ~s to 's in our query.
      SQLQuery := translate(to_char(v_SQLQuery),'~','''');
      status := 1; -- Everything went fine to get here
    EXCEPTION
      WHEN OTHERS THEN         
        raise_application_error
        (-20102, 'Exception occurred in GetSQLQueryFromXML :'||SQLERRM);
    END GetSQLQueryFromXML;The XML it works off of is
        someXML CLOB :=
        to_clob('<?xml version="1.0" encoding="windows-1252" ?>
    <variable table_name="SOME_PERSON_TABLE" query_type="PERSON">
      <item>
        <fieldName><![CDATA[PERSON_KEY]]></fieldName>
        <criteria><![CDATA[=]]></criteria>
        <fieldType><![CDATA[Integer]]></fieldType>
        <value><![CDATA[123456789]]></value>
      </item>
      <item>
        <fieldName><![CDATA[LAST_NAME]]></fieldName>
        <criteria><![CDATA[=]]></criteria>
        <fieldType><![CDATA[String]]></fieldType>
        <value><![CDATA[DOE]]></value>
      </item>
      <item>
        <fieldName><![CDATA[FIRST_NAME]]></fieldName>
        <criteria><![CDATA[=]]></criteria>
        <fieldType><![CDATA[String]]></fieldType>
        <value><![CDATA[JOHN]]></value>
      </item>
      <item>
        <fieldName><![CDATA[MIDDLE_NAME]]></fieldName>
        <criteria><![CDATA[-]]></criteria>
        <fieldType><![CDATA[String]]></fieldType>
        <value />
      </item>
      <item>
        <fieldName><![CDATA[SUFFIX]]></fieldName>
        <criteria><![CDATA[-]]></criteria>
        <fieldType><![CDATA[String]]></fieldType>
        <value />
      </item>
    </variable>');And the corresponding XSLT that should translate it is:
      myStylesheet  CLOB :=
      to_clob('<?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- <xsl:preserve-space elements="list-of-element-names"/> -->
      <!-- We just want the SQL text output.  No XML declaration etc. -->
      <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
    <!-- Apostrophes will be made tildas and the PL/SQL will translate those to -->
    <!-- apostrophes for the final SQL string. -->
    <xsl:variable name="apos">~</xsl:variable>
      <xsl:template match="/">
        select * from
        <xsl:value-of select="variable/@table_name"/>
        where 1=1
        <xsl:for-each select="variable/child::node()">
          <xsl:choose>
            <!-- if the value node is not null... -->
            <xsl:when test="./value/text()[normalize-space(.)]">
            <!-- There is another predicate.  Add the AND term and the predicate -->
              AND <xsl:value-of select="./fieldName"/>
              <xsl:text> </xsl:text>
              <xsl:value-of select="./criteria"/>
              <xsl:text> </xsl:text>       
              <xsl:choose>
                <xsl:when test="string(./fieldType)=''String''">
                  <xsl:copy-of select="$apos" />
                  <xsl:value-of select="./value"/>
                  <xsl:copy-of select="$apos" />
                </xsl:when>         
                <xsl:when test="string(./fieldType)=''Clob''">
                  <xsl:copy-of select="$apos" />
                  <xsl:value-of select="./value"/>
                  <xsl:copy-of select="$apos" />
                </xsl:when>
                <xsl:otherwise>
                  <xsl:value-of select="./value"/>
                </xsl:otherwise>
              </xsl:choose>
            </xsl:when>
          </xsl:choose>
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>');Basically if the VALUE element has a value then the fieldType is checked. If fieldType is String or Clob then we'll need the apostrophes. For now I'm putting in tildas and changing them later.

  • Creation of CDATA with message mapping

    Hello all,
    Is everyone absolutely sure that a cdata string cannot be created in the middle of an xml file using message mapping? 
    I have tried doing the XSL map in other blogs I even tried writing a whole XSL map in xml spy - yet xi complains about not finding this class file and that class file.  I'm having a hard time believing that this is so hard to do in XI - especially when Microsoft web service implementation seem to long for data crammed into a string ( in my experience ).
    Any help is GREATLY appreciated.
    Thank you!!!
    Scott

    Hi Scott,
             Pls follow the following steps to insert XML string into a single element:
    Create a xsl file with the following data:
    <?xml version='1.0' ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <i><b>NSpace</b></i>>
    <xsl:template match="/">
    <namespace:name1>
    <xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[]]></xsl:text><xsl:copy-of select="<b>//namespace:name</b>"/><xsl:text disable-output-escaping="yes"><![CDATA[]]]]></xsl:text><xsl:text disable-output-escaping="yes"><![CDATA[>]]></xsl:text>
    </namespace:name1>
    </xsl:template>
    </xsl:stylesheet>
    In the above code I have removed xmlns:p2="http://frik.bcc.com.pl" which is not needed.
    Also you have to put '<b>//</b>' before the target element from where you want to start creating XML string over here it is <b>name</b>. And <b>name1</b> is the element you want to store the XML string in.
    So anything in the element <b>name</b> will be stored in <b>name1</b>
    Regarding the <b>namespace:</b> To find out the namespace test your message mapping between the source and the target without adding XSLT mapping. After testing click on <b>'SCR'</b> tab present on top of the target window. There you will see <b>ns1: or ns2:</b> attached to each element. Replace <b>namespace</b> in the above code with <b>ns1: or ns2:</b>.  And replace <b>NSpace</b> in the above XSL Header with the namespace in the SCR of test map.
    So the final XSL file will look like that:
    <?xml version='1.0' ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <i><b>xmlns:ns1="http://sap.com/xi/HR"</b></i>>
    <xsl:template match="/">
    <<b>ns1:</b>name1>
    <xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[]]></xsl:text><xsl:copy-of select="<b>//ns1:name</b>"/><xsl:text disable-output-escaping="yes"><![CDATA[]]]]></xsl:text><xsl:text disable-output-escaping="yes"><![CDATA[>]]></xsl:text>
    </<b>ns1:</b>name1>
    </xsl:template>
    </xsl:stylesheet>
    Dont forget to put '//' before the target element.
    This should work. Or pls put the source and target xml struct and we will assist you further.
    Regards,
    Ashish

  • Embedding javascript with xslt generated html

    hi,
    I'm using xml/xslt with xdk to generate html with embedded javascript. The solution works except that I am having problem with proper inclusion of the javascript file. I uset this line:
    <xsl:template match="/">
    <head><title>Screener</title>
    <!-- Javascript declarations -->
    <script language="javascript1.2" src="./screener.js">
    </script>
    I have tested the xslt sheet via IE5 and msxml3 processor and it works fine including loading the javascript file.
    Now using XDK and servlet it doesn't seem to retrieve the javascript file so all javascript function do not work.
    I would appreciate any help.
    thanks,
    ted
    null

    hi brian,
    All those files are in same directory i changed the .xsl file to be i am changing at the right place.
    However, as backup i tried the following:
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
    <script language="javascript1.2">
    <![CDATA[
    <!--
    var isNav4, isIE4;
    if (parseInt(navigator.appVersion.charAt(0)) >= 4) {
    isNav4 = (navigator.appName == "Netscape")? true:false
    isIE4 = (navigator.appName.indexOf("Microsoft" != -1)) ? true:false
    if (isNav4) { document.write("<B>It's a Navigator!</B>");}
    else { document.write("It's an Explorer!");}
    //== shared global variables
    function _alert(e)
    alert(e);
    -->
    ]]>
    </script>
    and here is the html output:
    <html>
    <head>
    <title>Screener</title>
    <script language="javascript1.2">
    &#60;!--
    var isNav4, isIE4;
    if (parseInt(navigator.appVersion.charAt(0)) >= 4) {
    isNav4 = (navigator.appName == "Netscape")? true:false
    isIE4 = (navigator.appName.indexOf("Microsoft" != -1)) ? true:false
    if (isNav4) { document.write("&#60;B>It's a Navigator!&#60;/B>");}
    else { document.write("It's an Explorer!");}
    //== shared global variables
    function _alert(e)
    alert(e);
    -->
    </script>
    </head>
    So everything is being output correctly except for <!--; is there a way around this problem? If I leave out <!-- --> it works but
    i was wondering if the present behavior is what's supposed to happen.
    thanks,
    ted
    null

  • QTI Tranformation with XSLT

    I have a lot of trouble getting Dreamweaver 8 to transform an
    QTI formatted XML. Basically, it just produces an empty page.
    Here is the XSLT sample, it couldn't be simpler, the only XSL
    line is bolded.
    <?xml version="1.0" encoding="iso-8859-1"?><!--
    DWXMLSource="test.xml" --><!DOCTYPE xsl:stylesheet [
    <!ENTITY nbsp "&#160;">
    <!ENTITY copy "&#169;">
    <!ENTITY reg "&#174;">
    <!ENTITY trade "&#8482;">
    <!ENTITY mdash "&#8212;">
    <!ENTITY ldquo "&#8220;">
    <!ENTITY rdquo "&#8221;">
    <!ENTITY pound "&#163;">
    <!ENTITY yen "&#165;">
    <!ENTITY euro "&#8364;">
    ]>
    <xsl:stylesheet version="1.0" xmlns:xsl="
    http://www.w3.org/1999/XSL/Transform">
    <xsl
    utput method="html" encoding="iso-8859-1"
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
    doctype-system="
    http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
    <xsl:template match="/">
    <html xmlns="
    http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html;
    charset=iso-8859-1"/>
    <title>Untitled Document</title>
    </head>
    <body>
    <xsl:value-of select="item/@title"/>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>
    Here is the QTI formatted XML (text.xml). Only one item
    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
    <questestinterop xmlns="
    http://www.imsglobal.org/xsd/ims_qtiasiv1p2">
    <item ident="brgitem_test__1001" title="Commensal
    microbes are commonly found within certain organs in the human
    body, yet they do not cause disease. However, such microbes can act
    as opportunistic pathogens if given access to other human tissue.
    Which of the following species of microbes is fou">
    <itemmetadata>
    <qtimetadata>
    <qtimetadatafield>
    <fieldlabel>Subsubtopic</fieldlabel>
    <fieldentry>Anaerobic flora</fieldentry>
    </qtimetadatafield>
    <qtimetadatafield>
    <fieldlabel>Subtopic</fieldlabel>
    <fieldentry>Microbiology</fieldentry>
    </qtimetadatafield>
    <qtimetadatafield>
    <fieldlabel>Topic</fieldlabel>
    <fieldentry>General Principles</fieldentry>
    </qtimetadatafield>
    </qtimetadata>
    </itemmetadata>
    <presentation>
    <material>
    <mattext>Commensal microbes are commonly found within
    certain organs in the human body, yet they do not cause disease.
    However, such microbes can act as opportunistic pathogens if given
    access to other human tissue. Which of the following species of
    microbes is found only as an opportunistic
    pathogen?</mattext>
    </material>
    <response_lid ident="resp_001_01"
    rcardinality="Single">
    <render_choice shuffle="No">
    <response_label ident="A">
    <material>
    <mattext texttype="text/html">
    <![CDATA[<font
    color="#000000"><i>Propionibacterium</i></font>]]>
    </mattext>
    </material>
    </response_label>
    <response_label ident="B">
    <material>
    <mattext texttype="text/html">
    <![CDATA[<font
    color="#000000"><i>Bacteroides</i></font>]]>
    </mattext>
    </material>
    </response_label>
    <response_label ident="C">
    <material>
    <mattext texttype="text/html">
    <![CDATA[<font
    color="#000000"><i>Pseudomonas</i></font>]]>
    </mattext>
    </material>
    </response_label>
    <response_label ident="D">
    <material>
    <mattext texttype="text/html">
    <![CDATA[<font
    color="#000000"><i>Fusobacterium</i></font>]]>
    </mattext>
    </material>
    </response_label>
    <response_label ident="E">
    <material>
    <mattext texttype="text/html">
    <![CDATA[<font
    color="#000000"><i>Clostridium</i></font>]]>
    </mattext>
    </material>
    </response_label>
    </render_choice>
    </response_lid>
    </presentation>
    <resprocessing>
    <outcomes>
    <decvar defaultval="0"/>
    </outcomes>
    <respcondition>
    <conditionvar>
    <varequal respident="resp_001_01">A</varequal>
    </conditionvar>
    <displayfeedback linkrefid="general"/>
    </respcondition>
    <respcondition>
    <conditionvar>
    <varequal respident="resp_001_01">B</varequal>
    </conditionvar>
    <displayfeedback linkrefid="general"/>
    </respcondition>
    <respcondition>
    <conditionvar>
    <varequal respident="resp_001_01">C</varequal>
    </conditionvar>
    <setvar action="Set">1</setvar>
    <displayfeedback linkrefid="general"/>
    </respcondition>
    <respcondition>
    <conditionvar>
    <varequal respident="resp_001_01">D</varequal>
    </conditionvar>
    <displayfeedback linkrefid="general"/>
    </respcondition>
    <respcondition>
    <conditionvar>
    <varequal respident="resp_001_01">E</varequal>
    </conditionvar>
    <displayfeedback linkrefid="general"/>
    </respcondition>
    <respcondition>
    <conditionvar>
    <other respident="resp_001_01"/>
    </conditionvar>
    <displayfeedback linkrefid="general"/>
    </respcondition>
    </resprocessing>
    <itemfeedback ident="general">
    <material>
    <mattext texttype="text/html">
    <![CDATA[<font color="#000000"><b>The answer
    is C </b></font><font
    color="#000000"><i>Pseudomonas</i></font> are
    gram-negative aerobic motile rods that are not normally found
    within healthy tissue. <i>Propionibacterium</i>
    organisms are anaerobes found in the skin.
    <i>Bacteroides</i> are anaerobes that are found in the
    mouth, colon, and vagina. <i>Fusobacterium</i>
    organisms are anaerobes that live in the mouth.
    <i>Clostridium</i> organisms are anaerobes that are
    found in the colon.]]>
    </mattext>
    </material>
    </itemfeedback>
    </item>
    </questestinterop>
    When I hit preview in the XSLT file, the result is a blank
    page?!?!?!?!?!?
    Help please!!!!!

    Russ,
    Two XSLT 1.0 attributes that might allow you to accomplish what you want are:
    <xsl:output cdata-section-elements="documentation">
    This XSLT element tells the XSLT processor to always output text nodes within documentation elements as CDATA sections. Hence, with this
    <xsl:output> element and the template:
    <xsl:template match="documentation">
      <xsl:copy>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template
    your original example would be output as itself:
    <documentation><![CDATA[<p>Some text</p>]]></documentation>
    It gets more complicated if you want to illustrate CDATA sections in your documentation element.
    <xsl:value-of disable-output-escaping="yes">
    tells the processor to output those special characters that are interpreted by an XML parser as themselves instead of as one of the XML representations of those characters. Thus, you can try:
    <xsl:template match="documentation">
      <xsl:copy>
        <xsl:value-of disable-output-escaping="yes" select="."/>
      </xsl:copy>
    </xsl:template
    --Lynne

Maybe you are looking for