XSL Displaying Problem
Here should go questions about transforming XML with XSLT and FOP.
-
- Posts: 8
- Joined: Wed Nov 09, 2005 12:31 pm
XSL Displaying Problem
Hi all, i have a problem in XSL.
Actually i have a xml string that contain some XML nodes. I define one of the node as Base64Binary data type. I use <xsl:value-ofselect='nodeName'> in xsl to get the value, but the problem i found is it returned the encoded string to me, not the original string. Can someone please help me to solve this problem?
Value in XML node string:
<MessageContent xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="bin.base64">SABlAGwAbABvAA==</MessageContent>
The original message of the node:
Hello
Actually i have a xml string that contain some XML nodes. I define one of the node as Base64Binary data type. I use <xsl:value-ofselect='nodeName'> in xsl to get the value, but the problem i found is it returned the encoded string to me, not the original string. Can someone please help me to solve this problem?
Value in XML node string:
<MessageContent xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="bin.base64">SABlAGwAbABvAA==</MessageContent>
The original message of the node:
Hello
-
- Posts: 4141
- Joined: Fri Mar 28, 2003 2:12 pm
Post by sorin_ristache »
Hello,
In XML documents the base64 type is used for encoding illegal XML characters. You can't decode base64 encoded strings in standard XSLT, 1.0 or 2.0. You should use an extension function of the XSLT processor and if the output method of the stylesheet is XML you should enclose the base64 decoded string in a CDATA section. For that specify to the processor that the element that will contain the base64 decoded string has CDATA content:
where <a> contains the base64 decoded string</a>.
An alternative is to leave the string base64 encoded in the XSLT stylesheet output and postprocess the output with other tool.
I hope it helps,
Sorin
In XML documents the base64 type is used for encoding illegal XML characters. You can't decode base64 encoded strings in standard XSLT, 1.0 or 2.0. You should use an extension function of the XSLT processor and if the output method of the stylesheet is XML you should enclose the base64 decoded string in a CDATA section. For that specify to the processor that the element that will contain the base64 decoded string has CDATA content:
Code: Select all
<xsl:output cdata-section-elements="a" method="xml"/>
An alternative is to leave the string base64 encoded in the XSLT stylesheet output and postprocess the output with other tool.
I hope it helps,
Sorin
-
- Posts: 8
- Joined: Wed Nov 09, 2005 12:31 pm
Hi sorin, thank u for your help.
But my knowledge in XSL is quite limited. Can you explain how to get the string in XSL?
Actually my XSl already contains <xsl:output method="html" version="4.0"/>, when i add
<xsl:output cdata-section-elements="a" method="xml"/>, a problem occured.
Is it using <![CData[ <xsl:value-of select=''>]]> in XSl to get the value? I tried and it exactly returned the same string to me.
I think i need to explain why i'm using base64 data type in my xml node. Actually, i send a request xml string from asp to vb(server side). Then after processing the data, vb will send back a response in xml string which contains some nodes to asp. Then this string will be used in XSL code. The content of the node may contains a carriage return, for example:
Hello, every body
This is testing message
If i define the node type as string in XSD schema, i found that the carriage return was lost. I don't know why. So i change the node data type in XSD schema from string to base64Binary. If i do that, before going to XSL, i write the value of the node in asp, it shown me the original message including the carriage return. But if it is lost when i define it as string data type.
Do u or some body have idea to solve the problem?
But my knowledge in XSL is quite limited. Can you explain how to get the string in XSL?
Actually my XSl already contains <xsl:output method="html" version="4.0"/>, when i add
<xsl:output cdata-section-elements="a" method="xml"/>, a problem occured.
Is it using <![CData[ <xsl:value-of select=''>]]> in XSl to get the value? I tried and it exactly returned the same string to me.
I think i need to explain why i'm using base64 data type in my xml node. Actually, i send a request xml string from asp to vb(server side). Then after processing the data, vb will send back a response in xml string which contains some nodes to asp. Then this string will be used in XSL code. The content of the node may contains a carriage return, for example:
Hello, every body
This is testing message
If i define the node type as string in XSD schema, i found that the carriage return was lost. I don't know why. So i change the node data type in XSD schema from string to base64Binary. If i do that, before going to XSL, i write the value of the node in asp, it shown me the original message including the carriage return. But if it is lost when i define it as string data type.
Do u or some body have idea to solve the problem?
-
- Site Admin
- Posts: 2095
- Joined: Thu Jan 09, 2003 2:58 pm
Hi Ivan,
XSLT will not remove the new line characters if you to not normalize the text when you emit it to the output, for instance, on teh following XML:
if you apply a stylesheet like:
the result will be
As you can see the new lines are present.
--- start guessing ---
What I guess is that in your case you are looking at the HTML document as it is rendered by a browser, in that case you will not see the new lines even though they are present in the HTML source. You should check the source to see if the new lines are there or not. If you want new lines in the HTML rendered result you can either place the content inside a <pre> element or you should insert one <br> element in the place of each new line.
--- end guessing ---
Best Regards,
George
XSLT will not remove the new line characters if you to not normalize the text when you emit it to the output, for instance, on teh following XML:
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<MessageContent>
Hello, every body
This is testing message
</MessageContent>
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="MessageContent">
<MessageContent>
<xsl:value-of select="."/>
</MessageContent>
</xsl:template>
</xsl:stylesheet>
Code: Select all
<?xml version="1.0" encoding="UTF-8"?><MessageContent>
Hello, every body
This is testing message
</MessageContent>
--- start guessing ---
What I guess is that in your case you are looking at the HTML document as it is rendered by a browser, in that case you will not see the new lines even though they are present in the HTML source. You should check the source to see if the new lines are there or not. If you want new lines in the HTML rendered result you can either place the content inside a <pre> element or you should insert one <br> element in the place of each new line.
--- end guessing ---
Best Regards,
George
-
- Posts: 8
- Joined: Wed Nov 09, 2005 12:31 pm
Hi george, thanks for your suggestion. I use
<xsl:apply-templates select=".//MessageContent"/>
<xsl:template match="MessageContent">
<pre>
<xsl:value-of select="."/>
</pre>
</xsl:template>
the result contains the carriage return character. But how do i apply the disable-output-escaping in this case? For instance, on the following XML node value:
<MessageContent>
<B>Hello, every body</B>
<Font color="#FF0000">This is testing message</Font>
</MessageContent>
My expected output should not contains the <B>...</B> and <Font color="#FF0000">...</Font> tags.
How can i do that?
<xsl:apply-templates select=".//MessageContent"/>
<xsl:template match="MessageContent">
<pre>
<xsl:value-of select="."/>
</pre>
</xsl:template>
the result contains the carriage return character. But how do i apply the disable-output-escaping in this case? For instance, on the following XML node value:
<MessageContent>
<B>Hello, every body</B>
<Font color="#FF0000">This is testing message</Font>
</MessageContent>
My expected output should not contains the <B>...</B> and <Font color="#FF0000">...</Font> tags.
How can i do that?
-
- Site Admin
- Posts: 2095
- Joined: Thu Jan 09, 2003 2:58 pm
Hi Ivan,
You should not get B and Font elements if you use value-of. If you want B and Font elements to appear in the output use copy of, like below:
Best Regards,
George
You should not get B and Font elements if you use value-of. If you want B and Font elements to appear in the output use copy of, like below:
Code: Select all
<xsl:template match="MessageContent">
<pre>
<xsl:copy-of select="./node()"/>
</pre>
</xsl:template>
George
-
- Posts: 8
- Joined: Wed Nov 09, 2005 12:31 pm
Hi georg, i use <xsl:copy-of select="./node()"/> but the output still same.
Below is my html code in XSL:
<Table>
<TR>
<TD>
<Span>
<xsl:attribute name="class">msgContent</xsl:attribute>
<xsl:apply-templates select=".//MessageContent"/>
</Span>
</TD>
</TR>
</Table>
<xsl:template match="MessageContent">
<pre>
<xsl:copy-of select="./node()"/>
</pre>
</xsl:template>
Even the msgContent class has not been applied. How can i do that?
Thank you.
Below is my html code in XSL:
<Table>
<TR>
<TD>
<Span>
<xsl:attribute name="class">msgContent</xsl:attribute>
<xsl:apply-templates select=".//MessageContent"/>
</Span>
</TD>
</TR>
</Table>
<xsl:template match="MessageContent">
<pre>
<xsl:copy-of select="./node()"/>
</pre>
</xsl:template>
Even the msgContent class has not been applied. How can i do that?
Thank you.

-
- Site Admin
- Posts: 2095
- Joined: Thu Jan 09, 2003 2:58 pm
Hi,
It works for me, here it is a complete example.
test.xml
test.xsl
result
Best Regards,
George
It works for me, here it is a complete example.
test.xml
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<MessageContent>
<B>Hello, every body</B>
<Font color="#FF0000">This is testing message</Font>
</MessageContent>
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<Table>
<TR>
<TD>
<Span>
<xsl:attribute name="class">msgContent</xsl:attribute>
<xsl:apply-templates select=".//MessageContent"/>
</Span>
</TD>
</TR>
</Table>
</xsl:template>
<xsl:template match="MessageContent">
<pre>
<xsl:copy-of select="./node()"/>
</pre>
</xsl:template>
</xsl:stylesheet>
Code: Select all
<?xml version="1.0" encoding="utf-8"?><Table><TR><TD><Span class="msgContent"><pre>
<B>Hello, every body</B>
<Font color="#FF0000">This is testing message</Font>
</pre></Span></TD></TR></Table>
George
-
- Posts: 8
- Joined: Wed Nov 09, 2005 12:31 pm
-
- Posts: 8
- Joined: Wed Nov 09, 2005 12:31 pm
Jump to
- Oxygen XML Editor/Author/Developer
- ↳ Feature Request
- ↳ Common Problems
- ↳ DITA (Editing and Publishing DITA Content)
- ↳ SDK-API, Frameworks - Document Types
- ↳ DocBook
- ↳ TEI
- ↳ XHTML
- ↳ Other Issues
- Oxygen XML Web Author
- ↳ Feature Request
- ↳ Common Problems
- Oxygen Content Fusion
- ↳ Feature Request
- ↳ Common Problems
- Oxygen JSON Editor
- ↳ Feature Request
- ↳ Common Problems
- Oxygen PDF Chemistry
- ↳ Feature Request
- ↳ Common Problems
- Oxygen Feedback
- ↳ Feature Request
- ↳ Common Problems
- Oxygen XML WebHelp
- ↳ Feature Request
- ↳ Common Problems
- XML
- ↳ General XML Questions
- ↳ XSLT and FOP
- ↳ XML Schemas
- ↳ XQuery
- NVDL
- ↳ General NVDL Issues
- ↳ oNVDL Related Issues
- XML Services Market
- ↳ Offer a Service