请求协助完成UBL XML的XSLT转换:迁移标签值与属性转换
UBL格式转换:完成指定XSLT转换需求
初始XML文件
<root> <Invoice> <ID> <_>INV12345</_> </ID> <InvoiceTypeCode> <_>01</_> <listVersionID>1.0</listVersionID> </InvoiceTypeCode> <InvoicePeriod> <StartDate> <_>2017-11-26</_> </StartDate> <EndDate> <_>2017-11-30</_> </EndDate> </InvoicePeriod> <AccountingSupplierParty> <AdditionalAccountID> <_>id-1234</_> <schemeAgencyName>name1</schemeAgencyName> </AdditionalAccountID> </AccountingSupplierParty> </Invoice> </root>
目标XML文件
<Invoice> <ID>INV12345</ID> <InvoiceTypeCode listVersionID="1.0">01</InvoiceTypeCode> <InvoicePeriod> <StartDate>2017-11-26</StartDate> <EndDate>2017-11-30</EndDate> </InvoicePeriod> <AccountingSupplierParty schemeAgencyName="name1"> <AdditionalAccountID>id-1234</AdditionalAccountID> </AccountingSupplierParty> </Invoice>
转换要求
- 移除root标签
- 删除所有
<_>标签,将其文本值迁移至对应的父标签 - 将所有非
<_>的子标签转换为父标签的属性
现有基础代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- identity template --> <xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*" /> </xsl:copy> </xsl:template> <!-- remove root tag --> <xsl:template match="/*"> <xsl:apply-templates select="node()" /> </xsl:template> </xsl:stylesheet>
完整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> <!-- 移除根节点,直接处理其子节点 --> <xsl:template match="/*"> <xsl:apply-templates select="node()" /> </xsl:template> <!-- 处理包含<_>子元素的节点:提取<_>文本,将其他子元素转为属性 --> <xsl:template match="*[_]"> <xsl:copy> <!-- 将非<_>子元素转为当前节点的属性 --> <xsl:for-each select="*[local-name() != '_']"> <xsl:attribute name="{local-name()}"> <xsl:value-of select="." /> </xsl:attribute> </xsl:for-each> <!-- 插入<_>的文本作为当前节点的内容 --> <xsl:value-of select="_" /> <!-- 处理嵌套的子节点(如InvoicePeriod下的StartDate) --> <xsl:apply-templates select="*[not(local-name() = '_' or *[_])]" /> </xsl:copy> </xsl:template> <!-- 忽略<_>元素本身 --> <xsl:template match="_" /> </xsl:stylesheet>
代码说明
- 身份模板:保留默认的节点复制逻辑,确保未被特殊规则匹配的节点正常输出。
- 根节点处理:跳过root标签,直接渲染其内部的Invoice节点。
- 含<_>的节点处理:
- 遍历当前节点下所有非
<_>的子元素,将它们转为当前节点的属性,属性名用子元素的本地名称,属性值取子元素文本。 - 提取
<_>的文本内容,作为当前节点的文本值。 - 处理嵌套的子节点(如InvoicePeriod下的日期节点),确保深层结构正常转换。
- 遍历当前节点下所有非
- 忽略<_>元素:不再复制
<_>标签本身,避免冗余输出。
内容的提问来源于stack exchange,提问作者Volodymyr Patriiuk
相关产品推荐
相关产品推荐

