xsl-list
[Top] [All Lists]

Re: the "~" operator (was Re: [xsl] Add id to next element)

2022-05-23 06:08:50
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


--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--


<Prev in Thread] Current Thread [Next in Thread>