Antony
Antony

Reputation: 107

How to match the processing-instruction element in XSLT?

I have some processing-instructions elements inside my xml content, for example :

<?legalnoticestart?>
<?sourcenotestart?>
<para>Content para</para>
<?sourcenoteend?>
<?literallayoutstart?>
<para>body content </para>
<?literallayoutend?>
<?legalnoticeend?>

How can i match these elements and get the content in the below required element format?

Required xml:

<legalnotice>
<sourcenote>
<p>Content para</p>
</sourcenote>
<literallayout>
<p>body content</p>
</literallayout>
</legalnotice>

Please advice....

Best Regards, Antony

Upvotes: 10

Views: 12705

Answers (2)

butterchicken
butterchicken

Reputation: 13883

By default, an XSLT processor will ignore PIs - to match them in order to do fun and useful things, you can use the processing-instruction match in your template:

<xsl:template match="processing-instruction('legalnoticestart')">
  <legalnotice><xsl:value-of select="."/></legalnotice>
</xsl:template>

For example, the following Stylesheet:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="doc">
        <xsl:apply-templates select="processing-instruction('legalnoticestart')" />
    </xsl:template>

    <xsl:template match="processing-instruction('legalnoticestart')">
        <legalnotice><xsl:value-of select="."/></legalnotice>
    </xsl:template>
</xsl:stylesheet>

With this document:

<doc>
   <?legalnoticestart?>
   <?legalnoticeend?>
</doc>

Yields:

<?xml version="1.0"?>
<legalnotice>
</legalnotice>

Upvotes: 17

Chris Chilvers
Chris Chilvers

Reputation: 6479

This is inherently a bad design, you seem to be trying to match start/end tags but without using the methods available to if you were to use an actual xml element.

Whilst you can match the start/end processing instructions its difficult with xpath to locate the nodes between said processing instructions. If you have nesting or repeated such instructions it can become even more difficult. And at the end of the day, all this is doing is trying to replicate what xml already does without using xml?

Upvotes: 2

Related Questions