Hello @ all,
first: excuse me for my bad english - i hope you will understand me ;-).
It's been a while ago since i wrote a longer text ^^.
Now it's 2 years ago since i was working with XSLT and XML - but the
last week i mostly got back into it. My profession is more XHTML + CSS.
To the problem:
- i read the FAQ (all the FAQ's i found)
- used searchengines
to solve my "little" problem.
There are two systems. AuktionMaster and Yatego. Our products are listed
in the Database of AuktionMaster. Now i want to get them to another
marketplace > Yatego.
There's an option to generate a Eport-Format using XSL. With this XSL i
can generate a CSV File. I need this CSV file, because Yatego only
imports ;-separated CSV-Files. Ok - i thought - no problem. Well it's
frustrating :-(.
My XSL:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text" media-type="text/comma-separated-values"
version="1.0" indent="yes" encoding="ISO-8859-1" />
<!-- this must be meinly correct i think -->
<!-- fields needed -->
<xsl:template match="/">
<xsl:text>foreign_id;article_nr;title;tax;price;price_uvp;price_purchase;tax_differential;basic_price;units;delivery_surcharge;delivery_calc_once;short_desc;long_desc;url;auto_linefeet;picture;picture2;picture3;picture4;picture5;categories;variants;discount_set_id;stock;delivery_date;cross_selling;delitem;status;top_offer</xsl:text>
<xsl:text>
</xsl:text>
<xsl:apply-templates select="export/item"/>
</xsl:template>
<xsl:template match="export/item">
<xsl:choose>
<xsl:when test="inventory_active='1'"><!-- i check if product is
set flag active -->
... now i catch the fields needed with the fields from the source
<xsl:value-of select="item_id" /> <!-- for example product number -->
<xsl:text>;</xsl:text>
... well, i've got the field names from an other XSL inside of that
back-end. So i don't know which version/processor of XSL they use (sorry)
.... ok - i get the fields mainly by <xsl:value-of select="name" />
Now we came to the product description, which is stored with HTML inside
the DB. If i use
<xsl:value-of select="description_table/description"
disable-output-escaping="yes" />
the HTML Code with instyle CSS <p style="font: 9pt Arial,
sans-serif;">This Product is ...</p> and a lot other HTML Tags like
<div>, <img>, <ul> ... is breaking inside the CSV-File on the place of
the ";" (semicolon). Viewing the file with Excel one part of the HTML
Code is inside the field "long_desc" an the rest inside the other
fields. So the CSV-File is not correct.
Nearby with method="text" disable-output-escaping="yes" is not working
(i read it in the FAQ).
Then i found a lot of Tepmplates how to get the HTML Code inside this
one field through escaping quotes.
So i used
<xsl:text>"</xsl:text>
<xsl:apply-templates select="description_table/description"
mode="escape-CSV" />
<xsl:text>"</xsl:text>
<xsl:text>;</xsl:text>
... rest of the XSL:
<xsl:text></xsl:text>
<xsl:text>;</xsl:text>
<xsl:text>
</xsl:text><!-- line break here -->
</xsl:when>
</xsl:choose>
</xsl:template>
Here's the Template for escaping the quotes. It worked. But now it
doesn't. I don't know why. I never changed it. It's like i found it on
the net.
<xsl:template match="node()" mode="escape-CSV" name="escape-CSV">
<xsl:param name="string" select="." />
<xsl:choose>
<xsl:when test="contains($string, '"')">
<xsl:value-of select="substring-before($string, '"')" />
<xsl:text>\"</xsl:text>
<xsl:call-template name="escape-CSV">
<xsl:with-param name="string"
select="substring-after($string, '"')" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$string" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Ok i know i'll get it back to work - but the main problem is is: After
escaping the html-code it shows inside the CSV <p> ... . Because
the CSV is going to be importet in Yatego i need to replace the field
(string) and get the < and > back. So i tried and tried. And i didn't
get it. I know the problem isn't much big - but i need the
"Aaaaaah"-Effect to go on :-).
Here is one of the ideas i tried:
1.
<xsl:template match="node()" mode="escape_special_characters"
name="escape_special_characters">
<xsl:param name="input_text" select="." />
<!-- http://www.w3schools.com/xsl/el_param.asp -->
<xsl:variable name="step_1">
<xsl:call-template name="replace_quot">
<xsl:with-param name="input_text" select="." />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$step_1" />
</xsl:template>
2.
<xsl:template name="replace_lt">
<xsl:param name="input_text" />
<xsl:param name="special_char" />
<xsl:choose>
<xsl:when test="contains($input_text, $special_char)">
<xsl:value-of select="substring-before($input_text, $special_char)" />
<xsl:text><</xsl:text>
<xsl:value-of select="$special_char" />
<xsl:call-template name="replace_lt">
<xsl:with-param name="input_text"
select="substring-after($input_text, $special_char)" />
<xsl:with-param name="special_char" select="$special_char" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$input_text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
...
I think my main problem is not the recursive part it's the basic part of
calling the template:
<xsl:apply-templates select="description_table/description"
mode="escape-CSV" />
I don't know how to get all the templates to work or how correctly to
call them for:
- 1. double quote the HTML-Code to get something linke "&lgt;p> ... "
- 2. replace < with < and > with > to get correct HTML Code inside
the CSV
- 3. to import the CSV into Yatego to get the product description
displayed correctly in the browser.
Thank you all very very much for all kind of help.
Greetings
Eddie