Hi
I have the following XML & XSLT:
XML:
<?xml version="1.0" encoding="utf-8"?>
<Source Source="IBM">
<Detail>
<UserID></UserID>
<Time>200306101 35531</Time>
<ActionCode>IBM 421</ActionCode>
<ActionText>Sta rt sessie</ActionText>
<ChargingID>075 0490000011325</ChargingID>
</Detail>
<Detail>
<UserID>3162200 0658</UserID>
<Time>200306101 35532</Time>
<ActionCode>IBM 420</ActionCode>
<ActionText>Suc cesvolle account balance wijziging</ActionText>
<ChargingID>075 0490000011325</ChargingID>
</Detail>
<Detail>
<UserID>time-trigger</UserID>
<Time>200306132 35901</Time>
<ActionCode>IBM 440</ActionCode>
<ActionText>rap port 1</ActionText>
<ChargingID></ChargingID>
</Detail>
<Detail>
<UserID>time-trigger</UserID>
<Time>200306132 35902</Time>
<ActionCode>IBM 443</ActionCode>
<ActionText>Rap port 3</ActionText>
<ChargingID></ChargingID>
</Detail>
</Source>
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:styleshe et version="1.0"
xmlns:xsl="http ://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="ISO-8859-1"
indent="yes"/>
xsl:param name="action_co des" select="',420,4 21,422,430,431, 432,'"/>
<xsl:template match="/">
<xsomething>
<data_details >
<xsl:for-each select="Source/Detail[(contains($acti on_codes,concat (',',substring( ActionCode,4,3) ,',')))]">
<xsl:sort select="Time" order="ascendin g"/>
<data_detail>
<xsl:if test="string-length(UserID) != 0">
<user_id><xsl:v alue-of select="UserID"/></user_id>
</xsl:if>
<datum_record >
<xsl:value-of select="substri ng(Time,1, 4)"/>-<xsl:value-of
select="substri ng(Time, 5, 2)"/>-<xsl:value-of select="substri ng(Time,
7, 2)"/>T<xsl:value-of select="substri ng(Time, 9, 2)"/>:<xsl:value-of
select="substri ng(Time, 11, 2)"/>:<xsl:value-of
select="substri ng(Time, 13, 2)"/>
</datum_record>
<action_code><x sl:value-of select="ActionC ode"/></action_code>
<action_tekst>< xsl:value-of select="ActionT ext"/></action_tekst>
<xsl:if test="string-length(Charging ID) != 0">
<charging_id><x sl:value-of select="Chargin gID"/></charging_id>
</xsl:if>
<xsl:if test="string-length(Charging ID) = 0">
<charging_id><x sl:value-of
select="normali ze-space(preceding ::ChargingID[1])"/></charging_id>
</xsl:if>
</data_detail>
</xsl:for-each>
</data_details>
</xsomething>
</xsl:template>
</xsl:stylesheet>
The goal of my xslt is, that when the tag CHARGING_ID is missing that
the previously known charging_id will be used. Sometimes it will be
the previous another time it will be 10 'records' back.
Unfortunately the XSLT above is not working correctly, because when
the value of Charging_id is not present the tag will be supplied (I
cannot change it).
Is there another way to achieve my goal, by ie. changing this piece of
code 'preceding::Cha rgingID[1]'?
I have tried recursive templates but I didnt figured it out ?
Anyone an idea ?
greets
Sven
I have the following XML & XSLT:
XML:
<?xml version="1.0" encoding="utf-8"?>
<Source Source="IBM">
<Detail>
<UserID></UserID>
<Time>200306101 35531</Time>
<ActionCode>IBM 421</ActionCode>
<ActionText>Sta rt sessie</ActionText>
<ChargingID>075 0490000011325</ChargingID>
</Detail>
<Detail>
<UserID>3162200 0658</UserID>
<Time>200306101 35532</Time>
<ActionCode>IBM 420</ActionCode>
<ActionText>Suc cesvolle account balance wijziging</ActionText>
<ChargingID>075 0490000011325</ChargingID>
</Detail>
<Detail>
<UserID>time-trigger</UserID>
<Time>200306132 35901</Time>
<ActionCode>IBM 440</ActionCode>
<ActionText>rap port 1</ActionText>
<ChargingID></ChargingID>
</Detail>
<Detail>
<UserID>time-trigger</UserID>
<Time>200306132 35902</Time>
<ActionCode>IBM 443</ActionCode>
<ActionText>Rap port 3</ActionText>
<ChargingID></ChargingID>
</Detail>
</Source>
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:styleshe et version="1.0"
xmlns:xsl="http ://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="ISO-8859-1"
indent="yes"/>
xsl:param name="action_co des" select="',420,4 21,422,430,431, 432,'"/>
<xsl:template match="/">
<xsomething>
<data_details >
<xsl:for-each select="Source/Detail[(contains($acti on_codes,concat (',',substring( ActionCode,4,3) ,',')))]">
<xsl:sort select="Time" order="ascendin g"/>
<data_detail>
<xsl:if test="string-length(UserID) != 0">
<user_id><xsl:v alue-of select="UserID"/></user_id>
</xsl:if>
<datum_record >
<xsl:value-of select="substri ng(Time,1, 4)"/>-<xsl:value-of
select="substri ng(Time, 5, 2)"/>-<xsl:value-of select="substri ng(Time,
7, 2)"/>T<xsl:value-of select="substri ng(Time, 9, 2)"/>:<xsl:value-of
select="substri ng(Time, 11, 2)"/>:<xsl:value-of
select="substri ng(Time, 13, 2)"/>
</datum_record>
<action_code><x sl:value-of select="ActionC ode"/></action_code>
<action_tekst>< xsl:value-of select="ActionT ext"/></action_tekst>
<xsl:if test="string-length(Charging ID) != 0">
<charging_id><x sl:value-of select="Chargin gID"/></charging_id>
</xsl:if>
<xsl:if test="string-length(Charging ID) = 0">
<charging_id><x sl:value-of
select="normali ze-space(preceding ::ChargingID[1])"/></charging_id>
</xsl:if>
</data_detail>
</xsl:for-each>
</data_details>
</xsomething>
</xsl:template>
</xsl:stylesheet>
The goal of my xslt is, that when the tag CHARGING_ID is missing that
the previously known charging_id will be used. Sometimes it will be
the previous another time it will be 10 'records' back.
Unfortunately the XSLT above is not working correctly, because when
the value of Charging_id is not present the tag will be supplied (I
cannot change it).
Is there another way to achieve my goal, by ie. changing this piece of
code 'preceding::Cha rgingID[1]'?
I have tried recursive templates but I didnt figured it out ?
Anyone an idea ?
greets
Sven
Comment