How to change xml file using xslt

I need to change the value of a specific node element in an xml file via xsl. Below is my xml data.

<hospitals> <hospital> <department> <clinic> <cid>8</cid> <clinicName>clinic8</clinicName> <status>1</status> </clinic> <clinic> <cid>9</cid> <clinicName>clinic9</clinicName> <status>0</status> </clinic> <depId>3</depId> <departmentName>dental</departmentName> </department> <hospId>2</hospId> <hospitalName>appolo</hospitalName> </hospital> <hospital> <department> <clinic> <cid>82</cid> <clinicName>clinic82</clinicName> <status>0</status> </clinic> <clinic> <cid>92</cid> <clinicName>clinic92</clinicName> <status>0</status> </clinic> <depId>4</depId> <departmentName>mental</departmentName> </department> <hospId>2</hospId> <hospitalName>manipal</hospitalName> </hospital> </hospitals> 

for example, I need to select clinic9 based on its id ie 9 and change the status 0 to 1

I tried like this

 <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="hospId"/> <xsl:param name="depId" /> <xsl:param name="clinicId"/> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="hospitals/hospital[hospId='2']/department[depId='3']/clinic[cid='9']"> <xsl:choose> <xsl:when test="cid ='9'"> <xsl:element name="status">123</xsl:element> </xsl:when> </xsl:choose> </xsl:template> </xsl:stylesheet> 

But the meaning does not change ...

+4
source share
2 answers

If you are trying to change / replace a specific item, you need to map that item. For example, if you are trying to replace a specific status element, you need to map this particular element.

Modified XSLT

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:param name="hospId" select="'2'"/> <xsl:param name="depId" select="'3'"/> <xsl:param name="clinicId" select="'9'"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="hospitals/hospital[hospId='2']/department[depId='3']/clinic[cid='9']/status"> <status>123</status> </xsl:template> </xsl:stylesheet> 

XML output

 <hospitals> <hospital> <department> <clinic> <cid>8</cid> <clinicName>clinic8</clinicName> <status>1</status> </clinic> <clinic> <cid>9</cid> <clinicName>clinic9</clinicName> <status>123</status> </clinic> <depId>3</depId> <departmentName>dental</departmentName> </department> <hospId>2</hospId> <hospitalName>appolo</hospitalName> </hospital> <hospital> <department> <clinic> <cid>82</cid> <clinicName>clinic82</clinicName> <status>0</status> </clinic> <clinic> <cid>92</cid> <clinicName>clinic92</clinicName> <status>0</status> </clinic> <depId>4</depId> <departmentName>mental</departmentName> </department> <hospId>2</hospId> <hospitalName>manipal</hospitalName> </hospital> </hospitals> 
+2
source

It sounds like you are trying to use XSLT to modify the source XML file. XSLT cannot modify the source file. You can use it to convert XML and output it to another XML using a program or script that runs XSLT.

0
source

All Articles