This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

RE: Search and Replace in XSLT


Ciaran,

>1. Does this mean that the "tag" element becomes a child element of "img"
>
>img
>|
>|_ _ tag
>
>I want to include the tag element but not the img element in my output XML,
>so that when I get <img src="x.bmp" alt="[tag]"> then the output is just
><tag/> ( sorry, I didn't specify that before !!)

You don't have to output anything you don't want to: XSLT will only produce
the output that you tell it to produce.  If you have a template that
matches on 'img', then you can produce just the 'tag' element from it:

<xsl:template match="img">
  <xsl:element name="{translate(@alt, '[]', '')}" />
</xsl:template>

>2. How can I maipulate the case where I'd have mutiple attributes with
>values
>e.g.
><img src="x.bmp" alt="[tag1 value=tag1]Some text[tag2 value=tag2]"/>
>
>The reason I use '[' and ']' is that '<' and '>' can't reside inside the
>attribute.
>
>FYI - the reason I'm taking this approach is that in my MSHTML editor I
>can't handle
>unknown tags, so I was thinking of using a placeholder image with the "alt"
>value
>containing the XML markup that can't be recognised. Then when going back to
>XML,
>I recognise the image as a placeholder and extract from the "alt" attribute
>the
>XML markup and display as such. I'm open to any other ideas on this approach
>!!

Blimey, the lengths we'll go to to use a tool that we feel comfortable
with.  An alternative approach might be to use a tool that's designed to
write/read/edit XML to allow you to (even *help you to*) write the XML that
you want to write.  There's a list of free XML editors at
[http://www.garshol.priv.no/download/xmltools/cat_ix.html#SC_XMLEditors].
You could even write it by hand in any text editor: you're going to have to
be typing all that pseudo-XML by hand anyway.

Also, by the way, attributes *can* contain '<' (and '>'), it's just that
you have to escape '<' to &lt; to stop the XML parser getting confused and
thinking that you're trying to start a tag.  '>' can go in as it is.  So
you could alternatively use the pseudo-XML syntax:

<img src="x.bmp" alt="&lt;tag1 value=tag1>Some text&lt;tag2 value=tag2>"/>

I hope that clears things up a bit,

Jeni

P.S. I just couldn't resist: here's a shot at parsing the pseudo-XML
without any error handling if your pseudo-XML syntax is off, and that
hasn't included quotes around attribute values because you didn't in your
example:

<xsl:template name="parse-pseudo-XML-content">
  <xsl:param name="text" />
  <xsl:choose>
    <xsl:when test="contains($text, '[')">
      <xsl:value-of select="substring-before($text, '[')" />
      <xsl:call-template name="parse-pseudo-XML-element">
        <xsl:with-param name="text"
                        select="substring-after(substring-before($text, ']'), 
                                                '[')" />
      </xsl:call-template>
      <xsl:call-template name="parse-pseudo-XML-content">
        <xsl:with-param name="text"
                        select="substring-after($text, ']')" />
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$text" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="parse-pseudo-XML-element">
  <xsl:param name="text" />
  <xsl:choose>
    <xsl:when test="contains($text, ' ')">
      <xsl:element name="{substring-before($text, ' ')}">
        <xsl:call-template name="parse-pseudo-XML-attributes">
          <xsl:with-param name="text"
                          select="substring-after($text, ' ')" />
        </xsl:call-template>
      </xsl:element>
    </xsl:when>
    <xsl:otherwise>
      <xsl:element name="{$text}" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="parse-pseudo-XML-attributes">
  <xsl:param name="text" />
  <xsl:choose>
    <xsl:when test="contains($text, ' ')">
      <xsl:call-template name="parse-pseudo-XML-attribute">
        <xsl:with-param name="text" select="substring-before($text, ' ')" />
      </xsl:call-template>
      <xsl:call-template name="parse-pseudo-XML-attributes">
        <xsl:with-param name="text" select="substring-after($text, ' ')" />
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="parse-pseudo-XML-attribute">
        <xsl:with-param name="text" select="$text" />
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="parse-pseudo-XML-attribute">
  <xsl:param name="text" />
  <xsl:attribute name="{substring-before($text, '=')}">
    <xsl:value-of select="substring-after($text, '=')" />
  </xsl:attribute>
</xsl:template>

If this is really what you want to do, then you can call it on your img
element using:

<xsl:template match="img">
  <xsl:call-template name="parse-pseudo-XML-content">
    <xsl:with-param name="text" select="@alt" />
  </xsl:call-template>
</xsl:template>


Dr Jeni Tennison
Epistemics Ltd, Strelley Hall, Nottingham, NG8 6PE
Telephone 0115 9061301 • Fax 0115 9061304 • Email
jeni.tennison@epistemics.co.uk



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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]