如何根据属性名值复制XML标签?需编写对应XSLT
嘿,我来帮你搞定这个XSLT需求!首先先提个小细节:你提供的XML里第二个<WSData>标签多了个多余的引号,正确的写法应该是<WSData WSName="Standard">,这个小问题得先修正,不然后续XSLT处理可能会报错。
接下来,你想要根据<WSData>的WSName属性值来复制对应的XML标签,我会分几种常见需求给你示例代码,你可以根据自己的实际场景调整:
需求1:只保留特定WSName的<WSData>元素及其内容
比如你只想保留WSName="PersonData"的节点,过滤掉其他WSData,可以用下面的XSLT:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:默认复制所有未被特殊匹配的节点/属性,保留XML基础结构 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配所有非目标WSName的WSData,不输出它们(相当于过滤) --> <xsl:template match="WSData[not(@WSName='PersonData')]"/> </xsl:stylesheet>
运行后输出的XML会是:
<?xml version="1.0" encoding="UTF-8"?> <Job> <WSData WSName="PersonData"> <Name>Aghata</Name> <Id>1234567899</Id> </WSData> </Job>
需求2:提取特定WSName下的指定标签
比如你想单独提取WSName="Standard"下的<PersonalData>节点,可以这么写:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 直接选择目标节点并复制 --> <xsl:template match="/"> <xsl:copy-of select="/Job/WSData[@WSName='Standard']/RawData/PersonalData"/> </xsl:template> </xsl:stylesheet>
运行后输出的XML会是:
<?xml version="1.0" encoding="UTF-8"?> <PersonalData> <Name> Aghata </Name> <Identifier> 123456789 </Identifier> <Number> 12345678900 </Number> </PersonalData>
需求3:把一个WSName下的标签复制到另一个节点里
比如你想把PersonData下的<Id>复制到Standard的<PersonalData>中,实现内容合并:
<?xml version="1.0" encoding="UTF-8"?> <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> <!-- 匹配PersonalData节点,在它内部添加来自PersonData的Id标签 --> <xsl:template match="PersonalData"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> <!-- 精准选择目标标签并复制 --> <xsl:copy-of select="/Job/WSData[@WSName='PersonData']/Id"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
运行后输出的XML里,<PersonalData>会新增<Id>标签:
<?xml version="1.0" encoding="UTF-8"?> <Job> <WSData WSName="PersonData"> <Name>Aghata</Name> <Id>1234567899</Id> </WSData> <WSData WSName="Standard"> <RawData> <PersonalData> <Name> Aghata </Name> <Identifier> 123456789 </Identifier> <Number> 12345678900 </Number> <Id>1234567899</Id> </PersonalData> </RawData> </WSData> </Job>
核心思路就是用[@WSName='XXX']这个谓词精准匹配带有目标属性值的元素,再结合<xsl:copy>(复制节点结构并处理子节点)或<xsl:copy-of>直接复制节点内容来实现需求。
内容的提问来源于stack exchange,提问作者beginer beginer
相关产品推荐
相关产品推荐

