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

如何通过XSLT将XML属性转换为元素并生成目标结构?

XML转换需求:调整XSLT实现目标输出

我正在尝试转换XML文件,目前仅实现了部分效果,未能完全达到预期。已多次搜索相关方案,但仍未完美解决问题。现将相关文件附上,恳请协助调整XSLT以实现目标转换效果。

当前输出

<?xml version="1.0" encoding="utf-8"?>
<objects>
  <object><class>fhwed8885_notices</class><name>notices</name>
    <property><name>DocumentInformation</name>
      <object><class>fhwed8885_DocumentInformation</class><name>DocumentInformation</name>
        <property><name>DocId</name><value>510047</value></property>
        <property><name>GenerationType</name><value>pdf</value></property>
        <property><name>ReqId</name><value>aaa12345-555435d-ggaade5</value></property>
        <property><name>FilePath</name><value>missing</value></property>
      </object>
    </property>
    <property><name>PNAME</name>
      <object><class>fhwed8885_PNAME</class><name>PNAME</name>
        <property><name>NAME</name><value>JOHN KINGHT</value></property>
        <property><name>ADDR01</name><value>1896 KELLER SPRINGS</value></property>
        <property><name>ADDR02</name><value></value></property>
        <property><name>ADDR03</name><value></value></property>
        <property><name>ADDR04</name><value>ADDISON, TX 75181-0000</value></property>
      </object>
    </property>
  </object>
</objects>

XML输入

<objects>
    <object class="fhwed8885_notices" name="notices">
        <property name="DocumentInformation">
            <object class="fhwed8885_DocumentInformation" name="DocumentInformation">
                <property name="DocId" value="510047"/>
                <property name="GenerationType" value="pdf"/>
                <property name="ReqId" value="aaa12345-555435d-ggaade5"/>
                <property name="FilePath" value="missing"/>
            </object>
        </property>
        <property name="PNAME">
            <object class="fhwed8885_PNAME" name="PNAME">
                <property name="NAME" value="JOHN KINGHT"/>
                <property name="ADDR01" value="1896 KELLER SPRINGS"/>
                <property name="ADDR02" value=""/>
                <property name="ADDR03" value=""/>
                <property name="ADDR04" value="ADDISON, TX 75181-0000"/>
            </object>
        </property>
    </object>
</objects>

现有XSLT转换代码

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="@*">
        <xsl:apply-templates select="node()"/>
        <xsl:element name="{name()}">
            <xsl:value-of select="."/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

期望输出

<?xml version="1.0" encoding="utf-8"?>
<notices>
    <DocumentInformation>
        <DocId>510047</DocId>
        <GenerationType>pdf</GenerationType>
        <ReqId>aaa12345-555435d-ggaade5</ReqId>
        <ReqFilePath>missing</ReqFilePath>
    </DocumentInformation>
    <PNAME>
        <NAME>JOHN KINGHT</NAME>
        <ADDR01>1896 KELLER SPRINGS</ADDR01>
        <ADDR02/>
        <ADDR03/>
        <ADDR04>ADDISON, TX 75181-0000</ADDR04>
    </PNAME>
</notices>

修改后的XSLT代码

<?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" encoding="utf-8"/>
    
    <!-- 匹配根节点objects,直接处理内部的object -->
    <xsl:template match="/objects">
        <xsl:apply-templates select="object"/>
    </xsl:template>
    
    <!-- 匹配外层object,用其name属性作为根元素名 -->
    <xsl:template match="object[@name]">
        <xsl:element name="{@name}">
            <xsl:apply-templates select="property"/>
        </xsl:element>
    </xsl:template>
    
    <!-- 匹配包含子object的property,用其name属性作为元素名,处理内部的object子元素 -->
    <xsl:template match="property[object]">
        <xsl:element name="{@name}">
            <xsl:apply-templates select="object/*"/>
        </xsl:element>
    </xsl:template>
    
    <!-- 特殊处理FilePath,转换为ReqFilePath -->
    <xsl:template match="property[@name='FilePath']">
        <ReqFilePath>
            <xsl:value-of select="@value"/>
        </ReqFilePath>
    </xsl:template>
    
    <!-- 匹配其他带value属性的property,用name属性作为元素名,空值生成空元素 -->
    <xsl:template match="property[@value]">
        <xsl:element name="{@name}">
            <xsl:if test="@value != ''">
                <xsl:value-of select="@value"/>
            </xsl:if>
        </xsl:element>
    </xsl:template>
    
    <!-- 忽略默认复制模板,避免输出多余节点 -->
    <xsl:template match="@* | node()" priority="-1"/>
</xsl:stylesheet>

代码说明

  • 根节点模板:跳过原<objects>节点,直接处理内部的核心<object>节点;
  • 外层<object>模板:将节点的name属性值作为输出的根元素名(即<notices>);
  • 嵌套<property>模板:用自身name属性生成对应元素(如<DocumentInformation>),并处理子<object>内的所有属性节点;
  • 特殊字段处理:单独匹配FilePath属性,将其转换为<ReqFilePath>元素;
  • 普通属性处理:用name属性生成元素,若value非空则填充内容,空值生成自闭合空元素;
  • 低优先级默认模板:覆盖原有的复制逻辑,避免输出原XML中多余的节点结构。

内容的提问来源于stack exchange,提问作者user1935478

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:50:38