使用XSLT按条件修改元素中的现有值
用XSLT复制XML并修改指定学生的AdmissionNo属性
需求说明
复制XML中所有元素,同时将Name为CDE的学生的AdmissionNo改为989,Name为GHI的学生的AdmissionNo改为765。
输入XML
<College Name="" RoadNo="" BlockNo="" City="" > <Students> <Student Name="ABC" AdmissionNo="123" /> <Student Name="CDE" AdmissionNo="456" /> <Student Name="EFG" AdmissionNo="678" /> <Student Name="GHI" AdmissionNo="980" /> <Student Name="IJK" AdmissionNo="767" /> </Students> </College>
原代码问题
你之前的XSLT用了xsl:copy-of直接复制整个节点,这种方式只能原样复制内容,无法修改节点的属性值。要实现属性修改,需要使用身份模板默认复制所有内容,再针对需要修改的部分单独写匹配模板。
正确的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:默认复制所有节点、属性和文本 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 修改Name为CDE的Student的AdmissionNo属性值 --> <xsl:template match="Student[@Name='CDE']/@AdmissionNo"> <xsl:attribute name="AdmissionNo">989</xsl:attribute> </xsl:template> <!-- 修改Name为GHI的Student的AdmissionNo属性值 --> <xsl:template match="Student[@Name='GHI']/@AdmissionNo"> <xsl:attribute name="AdmissionNo">765</xsl:attribute> </xsl:template> </xsl:stylesheet>
代码解释
- 身份模板:
match="@*|node()"匹配所有属性和节点,通过xsl:copy复制原节点,再用xsl:apply-templates处理子节点/属性,保证默认所有内容都被原样复制。 - 属性修改模板:分别匹配特定
Student节点下的AdmissionNo属性,替换为目标值。XSLT会优先使用这些匹配模板而非身份模板,从而实现属性修改。
期望输出XML
<College Name="" RoadNo="" BlockNo="" City="" > <Students> <Student Name="ABC" AdmissionNo="123" /> <Student Name="CDE" AdmissionNo="989" /> <Student Name="EFG" AdmissionNo="678" /> <Student Name="GHI" AdmissionNo="765" /> <Student Name="IJK" AdmissionNo="767" /> </Students> </College>
内容的提问来源于stack exchange,提问作者Karna
相关产品推荐
相关产品推荐

