[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: RE: [docbook-apps] Namespace question
Thomas and George,
Thanks very much for your help; looks like exactly
what I need.
Dick
> -----Original Message-----
> From: George Cristian Bina [mailto:george@oxygenxml.com]
> Sent: Friday, March 21, 2008 3:27 AM
> To: Thomas Schraitle
> Cc: docbook-apps@lists.oasis-open.org
> Subject: Re: [docbook-apps] Namespace question
>
>
> Hi Thomas, Dick,
>
> I would just write the rename stylesheet as below:
>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:m="http://myschema.org/"
> xmlns:db="http://docbook.org/ns/docbook">
>
> <xsl:template match="/">
> <xsl:apply-templates mode="rename" select="."/>
> </xsl:template>
>
> <xsl:template match="m:*" mode="rename">
> <xsl:element name="db:{local-name()}">
> <xsl:apply-templates select="node() | @*" mode="rename"/>
> </xsl:element>
> </xsl:template>
>
> <xsl:template match="node() | @*" mode="rename">
> <xsl:copy>
> <xsl:apply-templates select="node() | @*" mode="rename"/>
> </xsl:copy>
> </xsl:template>
> </xsl:stylesheet>
>
> This will allow elements from other namespaces like SVG or MathML to
> pass through to the output and the customization will be able
> to process
> also DocBook documents.
>
> Best Regards,
> George
> ---------------------------------------------------------------------
> George Cristian Bina - http://aboutxml.blogspot.com/
> <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger
> http://www.oxygenxml.com
>
>
> Thomas Schraitle wrote:
> > Hi Dick,
> >
> > On Donnerstag, 20. März 2008, Dick Hamilton wrote:
> >> Is there a way to tell a stylesheet to process an instance
> >> in namespace X, as though it were really in namespace Y?
> >>
> >> E.g., suppose I get a boatload of content from a customer
> >> marked up in a minor variant of docbook identified with a
> >> different namespace (e.g., xmlns="http://myschema.org/").
> >> Even though that's not the best way to identify a DocBook
> >> variant, let's assume I can't edit their source, and I
> >> don't want to edit the standard stylesheets.
> >>
> >> Instead, I'd like to do something in my customization layer
> >> that effectively tells the imported stylesheets to treat
> >> input in the "http://myschema.org/" namespace as though it
> >> were in the docbook namespace.
> >>
> >> Anyone have any suggestions?
> >
> > There are two methods for your problem:
> >
> > A. The two-step-approach
> > B. The multi-pass approach
> >
> > Let's look first into (A) and assume, your XML file looks like this:
> >
> > -----[ chapter.xml ]-----
> > <chapter xmlns="http://myschema.org/"
> > xmlns:xlink="http://www.w3.org/1999/xlink">
> > <?dbfoo hello?>
> > <title>The Strange Namespace</title>
> > <!-- A comment -->
> > <para>Foo <link xlink:href="foo"/>.</para>
> > </chapter>
> > -------------------------
> >
> > Do the following:
> >
> > 1. Use the following stylesheet to renames the myschema
> namespace into the
> > DocBook5 namespace:
> >
> > -----[ rename2db5.xsl ]-----
> > <xsl:stylesheet version="1.0"
> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> > xmlns:d="http://docbook.org/ns/docbook"
> > xmlns:m="http://myschema.org/"
> > exclude-result-prefixes="m">
> >
> > <xsl:output indent="yes" method="xml"/>
> >
> > <xsl:preserve-space elements="m:screen m:programlisting"/>
> > <xsl:strip-space elements="m:*"/>
> >
> >
> > <xsl:template match="/">
> > <xsl:choose>
> > <xsl:when test="namespace-uri(*) = 'http://myschema.org/'">
> > <xsl:apply-templates mode="rename"/>
> > </xsl:when>
> > <xsl:otherwise>
> > <xsl:message>
> > <xsl:text>ERROR: Not the correct namespace. </xsl:text>
> > <xsl:text>Expected 'http://myschema.org/'.</xsl:text>
> > </xsl:message>
> > </xsl:otherwise>
> > </xsl:choose>
> > </xsl:template>
> >
> > <xsl:template match="m:*" mode="rename">
> > <xsl:element name="{local-name(.)}"
> > namespace="http://docbook.org/ns/docbook">
> > <xsl:copy-of select="@*"/>
> > <xsl:apply-templates mode="rename"/>
> > </xsl:element>
> > </xsl:template>
> >
> > <xsl:template match="comment()" mode="rename">
> > <xsl:copy-of select="."/>
> > </xsl:template>
> >
> > <xsl:template match="processing-instruction()" mode="rename">
> > <xsl:copy-of select="."/>
> > </xsl:template>
> >
> > </xsl:stylesheet>
> > ----------------------------
> >
> > That gives you the following output:
> >
> >
> > ---------[ Output ]---------
> > <?xml version="1.0"?>
> > <chapter xmlns="http://docbook.org/ns/docbook">
> > <?dbfoo hello?>
> > <title>The Strange Namespace</title>
> > <!-- A comment -->
> > <para>Foo <link xmlns:xlink="http://www.w3.org/1999/xlink"
> > xlink:href="foo"/>.</para>
> > </chapter>
> > ----------------------------
> >
> > 2. Apply your customization layer to the above output.
> >
> >
> > If you prefer the multi-pass approach, you could use the following
> > technique. See [1] for more details. However, it relies on
> the extension
> > function exslt:node-set. If you have very big documents it
> can also be a
> > matter of memory consumption.
> >
> > ----------------------------
> > <xsl:stylesheet version="1.0"
> > xmlns:d="http://docbook.org/ns/docbook"
> > xmlns:exslt="http://exslt.org/common"
> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> > exclude-result-prefixes="exslt d">
> >
> > <xsl:import
> >
> href="http://docbook.sourceforge.net/release/xsl-ns/current/xh
> tml/docbook.xsl"/>
> > <xsl:import href="rename2db5.xsl"/>
> >
> > <xsl:template match="/">
> > <xsl:if test="namespace-uri(*) != 'http://myschema.org/'">
> > <xsl:message terminate="yes"></xsl:message>
> > </xsl:if>
> > <!-- Maybe check here, if exslt:node-set exists in your XSLT
> > processor -->
> > <xsl:variable name="rtf">
> > <xsl:apply-templates mode="rename"/>
> > </xsl:variable>
> >
> > <xsl:apply-templates select="exslt:node-set($rtf)/*"/>
> > </xsl:template>
> >
> > </xsl:stylesheet>
> > ----------------------------
> >
> >
> >
> > Hope that helps,
> > Tom
> >
> >
> > ---- References
> > [1] http://www.ibm.com/developerworks/xml/library/x-tipxsltmp.html
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: docbook-apps-unsubscribe@lists.oasis-open.org
> For additional commands, e-mail:
> docbook-apps-help@lists.oasis-open.org
>
>
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]