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

如何修改XSLT提取XML中<bl>标签内的关联层级数据?

解决方案:修改XSLT提取XML中<bl>标签并保留层级属性

核心处理逻辑

  • 定位所有<bl>标签,捕获其前置的标识文本(如Fabrikat)与对应值(如Honda)
  • 向上遍历父节点,提取og、lg、ulg、grundtextnr层级编号属性
  • 重构输出XML结构,将关联信息与层级属性组织为结构化节点

修改后的XSLT代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

    <!-- 匹配根节点,初始化输出结构 -->
    <xsl:template match="/">
        <structured-records>
            <xsl:apply-templates select="//bl"/>
        </structured-records>
    </xsl:template>

    <!-- 处理单个<bl>节点 -->
    <xsl:template match="bl">
        <record>
            <!-- 提取前置标识:取<bl>前一个非空兄弟文本节点的内容 -->
            <xsl:variable name="field-label" select="normalize-space(preceding-sibling::text()[normalize-space()][last()])"/>
            <!-- 输出<bl>的文本值并关联标识 -->
            <field name="{$field-label}">
                <xsl:value-of select="normalize-space(.)"/>
            </field>
            <!-- 向上遍历提取所有层级属性 -->
            <xsl:for-each select="ancestor::*[@og or @lg or @ulg or @grundtextnr]">
                <xsl:if test="@og">
                    <level type="og" value="{@og}"/>
                </xsl:if>
                <xsl:if test="@lg">
                    <level type="lg" value="{@lg}"/>
                </xsl:if>
                <xsl:if test="@ulg">
                    <level type="ulg" value="{@ulg}"/>
                </xsl:if>
                <xsl:if test="@grundtextnr">
                    <level type="grundtextnr" value="{@grundtextnr}"/>
                </xsl:if>
            </xsl:for-each>
        </record>
    </xsl:template>

    <!-- 忽略空文本节点与非目标节点,避免冗余输出 -->
    <xsl:template match="text()[not(normalize-space())]"/>
    <xsl:template match="@*|node()[not(self::bl)]"/>
</xsl:stylesheet>

关键调整说明

  • 标识捕获:通过preceding-sibling::text()[normalize-space()][last()]精准获取<bl>的前置有效文本标识,若你的XML中标识是独立标签(如<label>),需修改该匹配路径
  • 层级属性提取:使用ancestor::*遍历所有包含目标属性的父节点,确保全层级编号无遗漏
  • 输出结构:将每个<bl>对应数据封装为<record>节点,通过<field>关联标识与值,<level>单独存储层级属性,结构清晰易读

输入输出示例

输入XML片段

<document og="001" lg="02">
    <subsection ulg="003" grundtextnr="GT-100">
        Fabrikat <bl>Honda</bl>
        Type <bl>Roadrunner</bl>
    </subsection>
</document>

输出XML结果

<structured-records>
    <record>
        <field name="Fabrikat">Honda</field>
        <level type="og" value="001"/>
        <level type="lg" value="02"/>
        <level type="ulg" value="003"/>
        <level type="grundtextnr" value="GT-100"/>
    </record>
    <record>
        <field name="Type">Roadrunner</field>
        <level type="og" value="001"/>
        <level type="lg" value="02"/>
        <level type="ulg" value="003"/>
        <level type="grundtextnr" value="GT-100"/>
    </record>
</structured-records>

适配提示

如果你的XML中标识与<bl>的关联逻辑(如标识在特定标签内)或层级属性的存储方式与示例不同,直接调整对应节点的匹配路径即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:16:02