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

Re: Serializing external XML documents

Subject: Re: Serializing external XML documents
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Wed, 10 Oct 2001 09:56:47 +0100
document serialize javascript
Hi Pedro,

> 1) I am using "document()" function (maybe abusing of it) to talk
> HTTP with an external application: Tamino DB.
>
> Question: Is there any other XSLT standard way of talking HTTP from
> inside a stylesheet ?

No. I'm interested about what you're doing here, because it
illustrates that xsl:message isn't the only thing that makes XSLT fall
short of the "no side-effects" ideal that's often touted as one of its
advantages. Presumably the _process URL causes information to be
inserted in the database; do you also have a document() function
*reading* from the same database?

> 2) One of the possible calls to Tamino is a "_process" function for
> content updating purposes. The syntax for this function is:
>
> DB-URL?_process=<XML object> (XML object stands for a text
> serialized XML fragment)
>
> Question: What is the most practical way of reading an external
> XML-file with the desired target XML information and serialize it as
> non-escaped XML markup text and insert it into the "document()"
> function to perform the HTTP call ?

If you're using MSXML, then you're lucky because you can create a
function that uses MSXML's own serialisation routines, something like:

<msxsl:script language="javascript" implements-prefix="my">
  function serialize(nodeSet) {
    return nodeSet.item(0).xml;
  }
</msxsl:script>

which you can then include in your document() call with:

  document(concat('DB-URL?_process=', my:serialize($source)))

If you're not using MSXML, then you need to create a string
serialisation with a set of templates, e.g. for elements you need
something along the lines of:

<xsl:template match="*" mode="serialize">
  <xsl:text />&lt;<xsl:value-of select="name()" />
  <xsl:apply-templates select="@*" mode="serialize" />
  <xsl:choose>
    <xsl:when test="node()">
      <xsl:text>></xsl:text>
      <xsl:apply-templates mode="serialize" />
      <xsl:value-of select="concat('&lt;/', name(), '>')" />
    </xsl:when>
  </xsl:choose>
</xsl:template>

For attributes you need something like:

<xsl:template match="@*">
  <xsl:value-of select="concat(' ', name(), '=&quot;')" />
  <xsl:call-template name="escapeXML">
    <xsl:with-param name="string" select="." />
  </xsl:call-template>
  <xsl:text>"</xsl:text>
</xsl:template>

where 'escapeXML' is a template that takes a string and replaces all
'&' with '&amp;', '<' with '&lt;' and so on. You need a similar thing
for text nodes:

<xsl:template match="text()">
  <xsl:call-template name="escapeXML">
    <xsl:with-param name="string" select="." />
  </xsl:call-template>
</xsl:template>

These are the simple templates - if you use namespaces, you also have
to worry about those within the template for serialising the elements;
if you have comments and processing instructions that you want to keep
then you have to have templates to serialise those as well, of course.

I hope that helps,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


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.