Reputation: 107
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
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
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