|
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 |