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

XSLT需求:缺失节点创建、重命名及XML结构简化

解决XML结构简化与Lokal标签处理的问题

我明白你的痛点——既要简化XML的多层嵌套结构,又要保证Lokal标签的重命名/创建逻辑不失效,之前的代码冲突就是因为结构展开后,原有的模板匹配规则不再适用了。下面是调整后的完整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>

    <!-- 展开DaneAdresowe和AdresGlownegoMiejscaWykonywaniaDzialalnosci层级 -->
    <xsl:template match="InformacjeOWpisie/DaneAdresowe">
        <xsl:apply-templates select="AdresGlownegoMiejscaWykonywaniaDzialalnosci/@*|AdresGlownegoMiejscaWykonywaniaDzialalnosci/node()"/>
    </xsl:template>

    <!-- 将存在的Lokal重命名为Lokal_test -->
    <xsl:template match="Lokal">
        <Lokal_test>
            <xsl:apply-templates select="@*|node()"/>
        </Lokal_test>
    </xsl:template>

    <!-- 当InformacjeOWpisie下没有Lokal_test时,添加空的Lokal_test节点 -->
    <xsl:template match="InformacjeOWpisie[not(.//Lokal_test)]">
        <xsl:copy>
            <!-- 先复制Budynek节点 -->
            <xsl:apply-templates select="Budynek"/>
            <!-- 添加空的Lokal_test -->
            <Lokal_test/>
            <!-- 复制Wojewodztwo节点 -->
            <xsl:apply-templates select="Wojewodztwo"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

代码说明:

  1. 身份模板:作为基础,确保所有未被特殊模板匹配的节点都能被原样复制。
  2. 层级展开模板:直接将AdresGlownegoMiejscaWykonywaniaDzialalnosci的子节点提升到InformacjeOWpisie下,同时移除DaneAdresowe和AdresGlownegoMiejscaWykonywaniaDzialalnosci这两层嵌套,解决结构简化的需求。
  3. Lokal重命名模板:直接匹配所有Lokal节点,将其替换为Lokal_test并保留原有内容,不再依赖父节点的路径,适配展开后的结构。
  4. 空Lokal_test创建模板:检查展开后的InformacjeOWpisie节点下是否存在Lokal_test,如果没有,就在Budynek和Wojewodztwo之间插入空的Lokal_test节点,保证和Access表结构匹配。

测试效果:

输入你提供的XML:

<Dane>
  <InformacjeOWpisie>
    <DaneAdresowe>
      <AdresGlownegoMiejscaWykonywaniaDzialalnosci>
        <Budynek>3a</Budynek>
        <Wojewodztwo>podlaskie</Wojewodztwo>
      </AdresGlownegoMiejscaWykonywaniaDzialalnosci>
    </DaneAdresowe>
  </InformacjeOWpisie>
  <InformacjeOWpisie>
    <DaneAdresowe>
      <AdresGlownegoMiejscaWykonywaniaDzialalnosci>
        <Budynek>8r</Budynek>
        <Lokal>2</Lokal>
        <Wojewodztwo>mazowieckie</Wojewodztwo>
      </AdresGlownegoMiejscaWykonywaniaDzialalnosci>
    </DaneAdresowe>
  </InformacjeOWpisie>
</Dane>

输出完全符合你的期望:

<Dane>
  <InformacjeOWpisie>
    <Budynek>3a</Budynek>
    <Lokal_test/>
    <Wojewodztwo>podlaskie</Wojewodztwo>
  </InformacjeOWpisie>
  <InformacjeOWpisie>
    <Budynek>8r</Budynek>
    <Lokal_test>2</Lokal_test>
    <Wojewodztwo>mazowieckie</Wojewodztwo>
  </InformacjeOWpisie>
</Dane>

之前的问题出在:你添加的展开模板直接拆解了AdresGlownegoMiejscaWykonywaniaDzialalnosci节点,导致原有的针对该节点的Lokal处理模板失去了匹配的上下文,现在调整后的模板直接针对最终展开后的结构进行处理,就不会再出现Lokal_test被移除的情况了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:35:42