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

