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

请求协助完成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>

代码说明

  1. 身份模板:保留默认的节点复制逻辑,确保未被特殊规则匹配的节点正常输出。
  2. 根节点处理:跳过root标签,直接渲染其内部的Invoice节点。
  3. 含<_>的节点处理:
    • 遍历当前节点下所有非<_>的子元素,将它们转为当前节点的属性,属性名用子元素的本地名称,属性值取子元素文本。
    • 提取<_>的文本内容,作为当前节点的文本值。
    • 处理嵌套的子节点(如InvoicePeriod下的日期节点),确保深层结构正常转换。
  4. 忽略<_>元素:不再复制<_>标签本身,避免冗余输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:44:53