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>
代码说明:
- 身份模板:作为基础,确保所有未被特殊模板匹配的节点都能被原样复制。
- 层级展开模板:直接将
AdresGlownegoMiejscaWykonywaniaDzialalnosci的子节点提升到InformacjeOWpisie下,同时移除DaneAdresowe和AdresGlownegoMiejscaWykonywaniaDzialalnosci这两层嵌套,解决结构简化的需求。 - Lokal重命名模板:直接匹配所有
Lokal节点,将其替换为Lokal_test并保留原有内容,不再依赖父节点的路径,适配展开后的结构。 - 空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
相关产品推荐
相关产品推荐

