XSLT - 根据条件修改元素兄弟节点的值

3
<?xml version="1.0" encoding="UTF-8"?>
<schools>
<city>Marshall</city>
<state>Maryland</state>
<highschool>
<schoolname>Marshalls</schoolname>
<department id="1">
  <deptCode>D1</deptCode>
  <deptName>Chemistry</deptName>
  <deptHead>Henry Carl</deptHead>
</department>
<department id="2">
  <deptCode>D2</deptCode>
  <deptName>Science-Physics</deptName>
  <deptHead>Martin Sean</deptHead>
</department>
<department id="3">
  <deptCode>D3</deptCode>
  <deptName>Science-Botany</deptName>
  <deptHead>Susanne Charles</deptHead>
</department>
<department id="4">
  <deptCode>D4</deptCode>
  <deptName>Science-Chemistry</deptName>
  <deptHead>Henry Carl</deptHead>
</department>
<highschool>
<schools>

从上面的XML中,如果城市是Marshal并且学校名称为Marshalls,则检查化学和科学化学两个部门名称是否存在, 如果是真的,则删除化学系的部门元素。如果Science-Chemistry不存在,则修改化学系的部门值为DeptCode为4,Dept Name为Science-Chemistry,并将Department属性id设为4。
以下是我正在使用的XSLT。我需要在remDept模板下编写代码以删除dept名称为Science Chemistry的部门。 如果Science Chemistry不存在,则在modifyDept模板中将Dept Code和Dept Name修改为D4。有人能帮我吗?先谢谢了。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="node()!@*">
  <xsl:copy>
     <xsl:apply-templates select="node()|@*"/>
  <xsl:copy>
</xsl:template>

<xsl:template match="/schools[city='Marshall' and /highschools/schoolname='Marshalls']">
   <xsl:if test="contains(deptName='Science-Chemistry')">
      <xsl:choose>
         <xsl:when test="contains(deptName='Chemistry'">
            <xsl:call-template name="remDept">
         </xsl:when>
         <xsl:otherwise>
             <xsl:call-template name="modifyDept">
         </xsl:otherwise>
      </xsl:choose>
   </xsl:if>
</xsl:template>

<xsl:template name="remDept">
// TO DO
</xsl:template>

<xsl:template name="modifyDept">
// TO DO
</xsl:template>


</xsl:stylesheet>
1个回答

4
从上面的xml中,如果城市是Marshal和学校名称是Marshalls, 然后检查化学和科学化学两个部门名称是否都存在, 如果为真,则删除化学系元素。如果 Science-Chemistry不存在,则将化学系修改为DeptCode为4和Dept Name为Science-Chemistry, 并将Department属性id设置为4。
也许我漏掉了些什么,但在我看来,这似乎可以通过以下简单方式完成(相对而言):
XSLT 1.0
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="department[../../city='Marshall' and ../schoolname='Marshalls' and deptName='Chemistry']">
    <xsl:if test="not(../department[deptName='Science-Chemistry'])">
        <department id="4">
            <deptCode>D4</deptCode>
            <deptName>Science-Chemistry</deptName>
            <xsl:copy-of select="deptHead"/>
        </department>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

我是一个对编写XSLT不熟悉的新手。在找到解决方案方面我遇到了很大困难。我一直想弄清楚层次结构是如何工作的,而你的解决方案帮助我学会了。非常感谢你。 - Udayakiran Vichinthangal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接