如何使用xslt修改xml文件 [英] how to modify xml file using xslt

查看:48
本文介绍了如何使用xslt修改xml文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need to change the value of particular element of a node in a xml through xsl file 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>

例如,我需要根据 id 选择诊所 9,即 9 并将状态 0 更改为 1

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

我是这样试的

<?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>

但值没有改变...

推荐答案

如果您尝试修改/替换特定元素,则需要匹配该元素.例如,如果您要替换特定的 status 元素,则需要匹配该特定元素.

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.

修改后的 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 输出

<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>

这篇关于如何使用xslt修改xml文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆