如何通过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
相关产品推荐
相关产品推荐

