xsl-list
[Top] [All Lists]

[xsl] How to copy attribute value to text?

2016-07-07 00:22:32
If I start with an input XML document that contains mixed text with <word> 
elements like this:

        … this is just <word correction=“too”>to</word> funny

I’d like to write an XSLT stylesheet that yields as output

        … this is just <word origerror=“to”>too</word> funny

So in the output I effectively want (in the same <word> element) to

        1.  Set the value of a new attribute to the original text() value, and 
        2.  Reset the text() value to be the value of the original @correction 
attribute

I’ve tried many variants of the following, so far without success.  I’m using 
SaxonHE9-7-0-6J;
it runs, but the results are not as expected/hoped.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

        <xsl:output method="xml" indent="yes"/>

        <xsl:template match="node()|@*">
                <xsl:copy>
                        <xsl:apply-templates select="node()|@*"/>
                </xsl:copy>
        </xsl:template>

                                
                                <xsl:template match="word[@correction]">

                                        <xsl:variable name="origtext" 
select="."/>
                                        <xsl:variable name="correction">
                                                <xsl:value-of 
select="@correction"/>
                                        </xsl:variable>

                                        <xsl:copy>
                                                <xsl:copy-of 
select="@*[name()!='correction']"/>
                                                <xsl:attribute name="origerror" 
select="$origtext"/>
                                                <xsl:value-of 
select="$correction"/>
                                        </xsl:copy>

                                </xsl:template>
</xsl:stylesheet>

I’ve tried matching the text() in a separate template, but I can’t seem to 
reference the attribute values of the parent node (i.e., <word>) of the text() 
and the parent node’s attributes.  E.g, the following doesn’t work for me, 
failing somehow in the 
select=“../@correction”  reference.

<xsl:template match=“word[@correction]/text()”>
        <xsl:value-of select=“../@correction”/>
</xsl:template>

Any help would be much appreciated.

********************************
Kenneth R. Beesley, D.Phil.
PO Box 540475
North Salt Lake UT 84054
USA



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