Reputation: 8696
I'm converting some XML files following a change to our DTD.
One of the changes involves changing what were processing-instructions into attributes on other elements - but I'm having trouble selecting specific information from instructions. I haven't been able to find much in how to use PIs - almost everything I find is about how to create them - but I did manage to find this: http://doccookbook.sourceforge.net/html/en/dbc.common.pi.html
For example - original XML:
<?Fm Condition FM8_SYSTEM_HIDEELEMENT Dark%20Grey NO_OVERRIDE hide AsIs?>
<?Fm Condition FM8_TRACK_CHANGES_ADDED Forest%20Green SINGLE_UNDERLINE show AsIs?>
<?Fm Condition FM8_TRACK_CHANGES_DELETED Red STRIKETHROUGH show AsIs?>
<products>
<?Fm Condstart p-version?>
<prod>
<form>inj</form>
<strength>10, 20, 50</strength>
</prod>
<?Fm Condend p-version?>
<?Fm Condstart e-version?>
<prod>
<form>inj</form>
<strength>10</strength>
<packsize>0.4 mL (syringe), 4</packsize>
</prod>
<prod>
<form>inj</form>
<strength>20</strength>
<packsize>0.4 mL (syringe), 4</packsize>
</prod>
<prod>
<form>inj</form>
<strength>50</strength>
<packsize>0.4 mL (syringe), 4</packsize>
</prod>
<?Fm Condend e-version?>
</products>
I tried this XSL template
<xsl:template match="processing-instruction()">
<xsl:choose>
<xsl:when test="'Condstart'">
<xsl:text>ELEPHANTS</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:copy />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
But it turns ALL of the processing instructions in the document to "ELEPHANTS" - not just the one I'm trying to select.
Upvotes: 3
Views: 983
Reputation: 243459
You want something like this:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"processing-instruction()[starts-with(.,'Condstart')]">
<xsl:text>ELEPHANTS</xsl:text>
</xsl:template>
</xsl:stylesheet>
When this transformation is applied on the provided (corrected for well-formedness) XML document:
<?Fm Condition FM8_SYSTEM_HIDEELEMENT Dark%20Grey NO_OVERRIDE hide AsIs?>
<?Fm Condition FM8_TRACK_CHANGES_ADDED Forest%20Green SINGLE_UNDERLINE show AsIs?>
<?Fm Condition FM8_TRACK_CHANGES_DELETED Red STRIKETHROUGH show AsIs?>
<products>
<?Fm Condstart p-version?>
<prod>
<form>inj</form>
<strength>10, 20, 50</strength>
</prod>
<?Fm Condend p-version?>
<?Fm Condstart e-version?>
<prod>
<form>inj</form>
<strength>10</strength>
<packsize>0.4 mL (syringe), 4</packsize>
</prod>
<prod>
<form>inj</form>
<strength>20</strength>
<packsize>0.4 mL (syringe), 4</packsize>
</prod>
<prod>
<form>inj</form>
<strength>50</strength>
<packsize>0.4 mL (syringe), 4</packsize>
</prod>
<?Fm Condend e-version?>
</products>
the wanted, correct result is produced:
<?Fm Condition FM8_SYSTEM_HIDEELEMENT Dark%20Grey NO_OVERRIDE hide AsIs?>
<?Fm Condition FM8_TRACK_CHANGES_ADDED Forest%20Green SINGLE_UNDERLINE show AsIs?>
<?Fm Condition FM8_TRACK_CHANGES_DELETED Red STRIKETHROUGH show AsIs?>
<products>
ELEPHANTS
<prod>
<form>inj</form>
<strength>10, 20, 50</strength>
</prod>
<?Fm Condend p-version?>
ELEPHANTS
<prod>
<form>inj</form>
<strength>10</strength>
<packsize>0.4 mL (syringe), 4</packsize>
</prod>
<prod>
<form>inj</form>
<strength>20</strength>
<packsize>0.4 mL (syringe), 4</packsize>
</prod>
<prod>
<form>inj</form>
<strength>50</strength>
<packsize>0.4 mL (syringe), 4</packsize>
</prod>
<?Fm Condend e-version?>
</products>
Upvotes: 3