|
Subject: Re: the "~" operator (was Re: [xsl] Add id to next element) From: "Chris Papademetrious christopher.papademetrious@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Mon, 23 May 2022 11:08:43 -0000 |
Hi everyone,
I found another case where the ~ operator might have been useful.
In the following XML:
====
<body>
<p/>
<p outputclass="foo bar"/>
<p outputclass="foo BAZ"/>
</body>
====
I want to add "BAZ" to p/@outputclass, without adding duplicate values of BAZ.
Right now I can do this with an extra user-defined function to add a string to
a sequence:
====
<xsl:template match="p">
<xsl:copy>
<xsl:attribute name="outputclass"
select="tokenize(@outputclass, '\s+')
=> mine:add_value('BAZ')
=> distinct-values()
=> string-join(' ')"/>
<xsl:apply-templates select="node()|(@* except @outputclass)"/>
</xsl:copy>
</xsl:template>
<xsl:function name="mine:add_value">
<xsl:param name="values" as="xs:string*"/>
<xsl:param name="new_value" as="xs:string"/>
<xsl:sequence select="($values, $new_value)"/>
</xsl:function>
====
But if the ~ operator were available, I think I could have done the value
addition natively (maybe?) instead of with a function:
====
<xsl:template match="p">
<xsl:copy>
<xsl:attribute name="outputclass"
select="tokenize(@outputclass, '\s+')
=> (~, 'BAZ')
=> distinct-values()
=> string-join(' ')"/>
<xsl:apply-templates select="node()|(@* except @outputclass)"/>
</xsl:copy>
</xsl:template>
====
(In the real code, this happens in the middle of the template with a computed
string value to add, so adding a test for existing values to the template
match is not an option.)
- Chris
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: the "~" operator (was Re: [xsl], Graydon graydon@xxxx | Thread | Re: the "~" operator (was Re: [xsl], John Lumley john@xxx |
| Re: [xsl] Add id to next element, Raghavendra Nyshadha | Date | Re: the "~" operator (was Re: [xsl], John Lumley john@xxx |
| Month |