You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据属性名值复制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:39:17