Subject: Re: [xsl] xsl with dynamic xpath statement from param and variable From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx> Date: Wed, 05 Sep 2007 21:01:33 -0400 |
My problem seems like it should be simple
Essentially there are nodes in my xml that I wish to discard based on a child value existing in that node. That value is to be supplied by a param.
The original data looks like: ... ---------------------------------------------
I only wish to retain in the output from the xsl the item elements where, in this case the <dict id="RT.VAL.CANCELDATE"> does not have a <val> child.
So far the stylesheet looks like:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:param name="argDictItem">RT.VAL.CANCELDATE</xsl:param> <xsl:variable name="sgl_qte">%27</xsl:variable>
<xsl:variable name="xpathDictItem" select="concat('group/dict[@id=',$sgl_qte,$argDictItem,$sgl_qte,']/val') "/>
<xsl:template match="/"> <xsl:comment> $xpathDictItem = <xsl:value-of select="$xpathDictItem"/> </xsl:comment> <xsl:copy> <xsl:apply-templates select="node()"/> </xsl:copy>
</xsl:template> <xsl:template match="node()">
<xsl:if test="name()!='item'"> <!-- carry on copying nodes --> <xsl:copy> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:if> <xsl:if test="name()='item'">
<!-- copy item node only if the argDictItem does not have a value --> <xsl:choose> <xsl:when test="not($xpathDictItem)">
<xsl:comment> node discarded - variable value used </xsl:comment> </xsl:when> <xsl:when test="group/dict[@id='RT.VAL.CANCELDATE']/val">
<xsl:comment> node discarded - hardcoded value used </xsl:comment> </xsl:when> <xsl:otherwise> <xsl:copy> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:otherwise> </xsl:choose> </xsl:if> </xsl:template> </xsl:stylesheet> ... However I wish to be able to delete the <item> elements based on the argDictItem parameter rather than my hardcoded value.
Any leads would be most appreciated.
T:\ftemp>type ralph.xml <origenxml xmlns=""> <data> <item> <id>07011*810*00*</id> <obj>RT.VALUATION</obj> <group> <id>MAIN</id> <dict id="RT.VAL.ID.RAW"> <desc>valuation number</desc> <val>07011*810*00*</val> </dict> <dict id="RT.VAL.CANCELDATE"> <desc>cancel date</desc> <val>01 Jan 2006</val> </dict> </group> </item> <item> <id>07011*810*06*</id> <obj>RT.VALUATION</obj> <group> <id>MAIN</id> <dict id="RT.VAL.ID.RAW"> <desc>valuation number</desc> <val>07011*810*06*</val> </dict> <dict id="RT.VAL.CANCELDATE"> <desc>cancel date</desc> </dict> </group> </item> </data> </origenxml>
T:\ftemp>type ralph.xsl <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:param name="argDictItem">RT.VAL.CANCELDATE</xsl:param>
<xsl:template match="/"> <xsl:comment> $argDictItem = <xsl:value-of select="$argDictItem"/> </xsl:comment> <xsl:apply-templates select="node()"/> </xsl:template>
<xsl:template match="*"> <!--preserve this element--> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template>
<xsl:template match="item"> <!-- copy item node only if the argDictItem does not have a value --> <xsl:choose> <xsl:when test="group/dict[@id=$argDictItem]/val"> <xsl:comment> node discarded - detected <xsl:value-of select="$argDictItem"/> with a val </xsl:comment> </xsl:when> <xsl:otherwise> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:otherwise> </xsl:choose> </xsl:template>
T:\ftemp>type ralph.out <!-- $argDictItem = RT.VAL.CANCELDATE--><origenxml>
<data> <!-- node discarded - detected RT.VAL.CANCELDATE with a val -->
</origenxml> T:\ftemp>type ralph2.xsl <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:param name="argDictItem">RT.VAL.CANCELDATE</xsl:param>
<xsl:template match="/"> <xsl:comment> $argDictItem = <xsl:value-of select="$argDictItem"/> </xsl:comment> <xsl:apply-templates select="node()"/> </xsl:template>
<xsl:template match="*"> <!--preserve this element--> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template>
<xsl:template match="item[group/dict[@id=$argDictItem]/val]"> <xsl:comment> node discarded - detected <xsl:value-of select="$argDictItem"/> with a val </xsl:comment> </xsl:template>
-- Upcoming public training: XSLT/XSL-FO Sep 10, UBL/code lists Oct 1 World-wide corporate, govt. & user group XML, XSL and UBL training RSS feeds: publicly-available developer resources and training G. Ken Holman mailto:gkholman@xxxxxxxxxxxxxxxxxxxx Crane Softwrights Ltd. http://www.CraneSoftwrights.com/s/ Box 266, Kars, Ontario CANADA K0A-2E0 +1(613)489-0999 (F:-0995) Male Cancer Awareness Jul'07 http://www.CraneSoftwrights.com/s/bc Legal business disclaimers: http://www.CraneSoftwrights.com/legal
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] xsl with dynamic xpath statem, Ralph Price | Thread | RE: [xsl] xsl with dynamic xpath st, Ralph Price |
Re: [xsl] Templates, XSL-List Owner | Date | RE: [xsl] xsl with dynamic xpath st, Ralph Price |
Month |