|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Matching a first instance.
This transformation:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:myIDs="my:Ids"
exclude-result-prefixes="myIDs">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*" />
<myIDs:myIDs>
<id>personal</id>
<id>handheld</id>
</myIDs:myIDs>
<xsl:variable name="vIDs" select="document('')/*/myIDs:*/*"/>
<xsl:template match="@* | node()" name="ident">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="TestElement[@xmlid='testID']/*">
<xsl:choose>
<xsl:when test="@xmlid = $vIDs
and
not(preceding-sibling::*[@xmlid = $vIDs])">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="cost">0</xsl:attribute>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="ident"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
when applied on your source.xml:
<t>
<TestElement xmlid="testID">
<adder xmlid="Not_In_The_Set_To_Be_Recognized" cost="1" alias="Not In
The
Set We Care About" />
<adder xmlid="handheld" cost="2" alias="handheld computers" />
<adder xmlid="Not_In_The_Set_To_Be_Recognized" cost="1" alias="Not In
The
Set We Care About" />
<adder xmlid="personal" cost="2" alias="personal computers" />
</TestElement>
<TestElement xmlid="testID">
<adder xmlid="personal" cost="2" alias="personal computers" />
<adder xmlid="handheld" cost="2" alias="handheld computers" />
<adder xmlid="Not_In_The_Set_To_Be_Recognized" cost="1" alias="Not In
The
Set We Care About" />
</TestElement>
</t>
produces the wanted result:
<t>
<TestElement xmlid="testID">
<adder xmlid="Not_In_The_Set_To_Be_Recognized" cost="1" alias="Not In
The Set We Care About"/>
<adder xmlid="handheld" cost="0" alias="handheld computers"/>
<adder xmlid="Not_In_The_Set_To_Be_Recognized" cost="1" alias="Not In
The Set We Care About"/>
<adder xmlid="personal" cost="2" alias="personal computers"/>
</TestElement>
<TestElement xmlid="testID">
<adder xmlid="personal" cost="0" alias="personal computers"/>
<adder xmlid="handheld" cost="2" alias="handheld computers"/>
<adder xmlid="Not_In_The_Set_To_Be_Recognized" cost="1" alias="Not In
The Set We Care About"/>
</TestElement>
</t>
Please, also note that according to the XML spec names starting with "xml"
are reserved and are not recommended to be used.
=====
Cheers,
Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL
"Ben Trafford" <ben@xxxxxxxxxxx> wrote in message
news:5.2.0.9.2.20031128205856.037d3168@xxxxxxxxxxxxxxxxxxxx
>
> Hi!
>
> I have a somewhat unusual problem. I want to match an xsl:if test to the
> first occurrence of an element with an attribute of a particular value. An
> example snippet of XML to be transformed:
>
> <TestElement xmlid="testID">
> <adder xmlid="personal" cost="2" alias="personal computers" />
> <adder xmlid="handheld" cost="2" alias="handheld computers" />
> <adder xmlid="network" cost="2" alias="networked computers" />
> <adder xmlid="mainframe" cost="2" alias="mainframe" />
> </TestElement>
>
> The test needs to find all the TestElements whose xmlid is
> 'testID''. Then find the first child element whose xmlid matches any of
> those listed. Then change that child element's "cost" attribute to "0".
> Leave the other "cost" attributes alone.
>
> So, the above snippet would be changed to:
>
> <TestElement xmlid="testID">
> <adder xmlid="personal" cost="0" alias="personal computers" />
> <adder xmlid="handheld" cost="2" alias="handheld computers" />
> <adder xmlid="network" cost="2" alias="networked computers" />
> <adder xmlid="mainframe" cost="2" alias="mainframe" />
> </TestElement>
>
> The following snippet:
>
> <TestElement xmlid="testID">
> <adder xmlid="Not_In_The_Set_To_Be_Recognized"
> <adder xmlid="handheld" cost="2" alias="handheld computers" />
> </TestElement>
>
> would be changed to:
>
> <TestElement xmlid="testID">
> <adder xmlid="Not_In_The_Set_To_Be_Recognized" cost="1" alias="Not In The
> Set We Care About" />
> <adder xmlid="handheld" cost="0" alias="handheld computers" />
> </TestElement>
>
> And the following:
>
> <TestElement xmlid="testID">
> <adder xmlid="Not_In_The_Set_To_Be_Recognized" cost="1" alias="Not In The
> Set We Care About" />
> <adder xmlid="handheld" cost="2" alias="handheld computers" />
> <adder xmlid="Not_In_The_Set_To_Be_Recognized" cost="1" alias="Not In The
> Set We Care About" />
> <adder xmlid="personal" cost="2" alias="personal computers" />
> </TestElement>
> <TestElement xmlid="testID">
> <adder xmlid="personal" cost="2" alias="personal computers" />
> <adder xmlid="handheld" cost="2" alias="handheld computers" />
> <adder xmlid="Not_In_The_Set_To_Be_Recognized" cost="1" alias="Not In The
> Set We Care About" />
> </TestElement>
>
> would become:
>
> <TestElement xmlid="testID">
> <adder xmlid="Not_In_The_Set_To_Be_Recognized" cost="1" alias="Not In The
> Set We Care About" />
> <adder xmlid="handheld" cost="0" alias="handheld computers" />
> <adder xmlid="Not_In_The_Set_To_Be_Recognized" cost="1" alias="Not In The
> Set We Care About" />
> <adder xmlid="personal" cost="2" alias="personal computers" />
> </TestElement>
> <TestElement xmlid="testID">
> <adder xmlid="personal" cost="0" alias="personal computers" />
> <adder xmlid="handheld" cost="2" alias="handheld computers" />
> <adder xmlid="Not_In_The_Set_To_Be_Recognized" cost="1" alias="Not In The
> Set We Care About" />
> </TestElement>
>
> Any help would be much appreciated. Note that the "xmlid" attributes being
> used are -not- unique. They will re-occur.
>
> --->Ben
>
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








