[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: problem with transforming mixed content

Subject: Re: problem with transforming mixed content
From: "Imsieke, Gerrit, le-tex gerrit.imsieke@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Sat, 15 Aug 2020 05:56:53 -0000
Re:  problem with transforming mixed content
Dear Wolfhart,

If the input elements are in a certain namespace, then seeing a namespace *declaration* (xmlns:prefix="uri") is probably less of a problem than seeing the original <i> element in whatever namespace it used to be (<i xmlns="orig-ns">).

In this case, even <xsl:copy copy-namespaces="no"> wouldn't help because if the <i> is reproduced by xsl:copy, it will keep its namespace. Only declarations that are not needed will be left out, but i's namespace *is* needed if it remains in its original namespace.

In order to "copy" the source elements, but put them in another namespace, you don't use <xsl:copy>. You can use <xsl:element name="{local-name()}"> in order to keep the (unprefixed, if the input elements had a prefix) name but put the result in whatever namespace the rest of the output is in.

hth

Gerrit

On 15.08.2020 07:25, Wolfhart Totschnig wolfhart.totschnig@xxxxxxxxxxx wrote:
Thank you very much, Graydon and Dimitre, for your replies! Your solutions work very well and deepened my understanding of XSLT.

There is just one little problem I encountered: The data of the external source comes in a particular namespace. Since I do not want to have the namespace declaration in the output, I use @exclude-result-prefixes in the <xsl:stylesheet> element, which works as expected for the rest of the output produced by my stylesheet and also for the <title> and <subtitle> elements produced by your solutions. However, on the <i> elements, the namespace declaration suddenly shows up, which baffles me. Do you know why that is? And how do I get rid of it?

Best,
Wolfhart

On 14.08.20 23:08, Dimitre Novatchev dnovatchev@xxxxxxxxx wrote:
XSLT 2.0:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
B <xsl:output omit-xml-declaration="yes" indent="yes"/>


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

B <xsl:template match="title/text()[contains(., ':')]">
B B <title>
B B B <xsl:apply-templates select="preceding-sibling::node()" mode="copy-lowercase"/>
B B B <xsl:copy-of select="lower-case(substring-before(., ':'))"/>
B B </title>
B B <subtitle>
B B B <xsl:copy-of select="lower-case(substring-after(., ':'))"/>
B B B <xsl:apply-templates select="following-sibling::node()" mode="copy-lowercase"/>
B B </subtitle>
B </xsl:template>


B <xsl:template match="text()"/>

B <xsl:template match="title//text()" mode="copy-lowercase"><xsl:value-of select="lower-case(.)"/></xsl:template>
</xsl:stylesheet>


When applied on the provided XML document:

<title>THE TITLE OF THE BOOK WITH SOME
B  B <i>ITALICS</i> AND SOME MORE
WORDS: THE SUBTITLE OF THE BOOK WITH SOME
B  B <i>ITALICS</i>
</title>

the wanted result is produced:

<title>the title of the book with some
<i>italics</i> and some more
words</title>
<subtitle> the subtitle of the book with some
<i>italics</i>
</subtitle>

B  --
Cheers,
Dimitre Novatchev


On Fri, Aug 14, 2020 at 7:16 PM Wolfhart Totschnig wolfhart.totschnig@xxxxxxxxxxx <mailto:wolfhart.totschnig@xxxxxxxxxxx> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx <mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>> wrote:


Dear list,

    I would like to ask for your help with the following mixed-content
    problem. I am receiving, from an external source, data in the
    following
    form:

    <title>THE TITLE OF THE BOOK WITH SOME <i>ITALICS</i> AND SOME MORE
    WORDS: THE SUBTITLE OF THE BOOK WITH SOME <i>ITALICS</i></title>

    What I would like to do is
    1) separate the title from the subtitle (i.e., divide the data at the
    colon) and put each in a separate element node;
    2) all the while maintaining the <i> markup;
    3) and perform certain string manipulations on all of the text nodes;
    for the purposes of this post, I will use the example of converting
    upper-case to lower-case.

So the desired output is the following:

    <title>the title of the book with some <i>italics</i> and some more
    words</title>
    <subtitle>the subtitle of the book with some <i>italics</i></subtitle>

How can this be done?

    I know that I can perform string manipulations while maintaining
    the <i>
    markup with templates, i.e., <xsl:template match="text()"/> and
    <xsl:template match="i"/>. But in this case I do not know how to
    divide
    the data at the colon. And I know that I can divide the data at the
    colon with <xsl:value-of select="substring-before(.,': ')"/>, but
    then I
    loose the <i> markup. So I am at a loss.

    Thanks in advance for your help!
    Wolfhart

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.