如何使用xslt修改xml文件

时间:2021-05-28 07:14:13

I need to change the value of particular element of a node in a xml through xsl file Below is my xml data

我需要通过xsl文件更改xml中节点的特定元素的值以下是我的xml数据

<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

例如,我需要根据其id(即9)选择诊所9,并将状态0更改为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 value is not changing...

但价值并没有改变......

2 个解决方案

#1


2  

If you are trying to modify/replace a specific element, you need to match that element. For example, if you are trying to replace a specific status element, you need to match that specific 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


0  

It sounds as if you are trying to use XSLT to change the original XML file. XSLT cannot change the original file. You may use it to transform the XML and output it to another XML through the use of a program or script that runs XSLT.

听起来好像您正在尝试使用XSLT来更改原始XML文件。 XSLT无法更改原始文件。您可以使用它来转换XML并通过使用运行XSLT的程序或脚本将其输出到另一个XML。

#1


2  

If you are trying to modify/replace a specific element, you need to match that element. For example, if you are trying to replace a specific status element, you need to match that specific 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


0  

It sounds as if you are trying to use XSLT to change the original XML file. XSLT cannot change the original file. You may use it to transform the XML and output it to another XML through the use of a program or script that runs XSLT.

听起来好像您正在尝试使用XSLT来更改原始XML文件。 XSLT无法更改原始文件。您可以使用它来转换XML并通过使用运行XSLT的程序或脚本将其输出到另一个XML。