XSLT:如果不存在则创建节点并简化标签树

XSLT: create node if does not exists and simplify tags tree

我知道类似的问题已经存在,但其中 none 似乎对我有用。特别是在简化 XML 结构时。

很快,我有 XML 个带有标签 "Lokal" 的文件,在大多数情况下它不会出现,但它应该出现。不会让事情变得更简单:我还需要将 "Lokal" 的名称更改为 "Lokal_test"。我的目标是修改节点名称(如果存在)或创建它并重命名(如果不存在)。 XML 中的数据将导入到 MS Access 数据中,因此它们需要与 table...

完美匹配

样本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>

我已经在 问题中要求提供此代码。

下面的代码有效:

<!-- Handles the replacement of the 'Lokal' element -->
<xsl:template match="AdresGlownegoMiejscaWykonywaniaDzialalnosci/Lokal">
    <Lokal_test>
        <xsl:apply-templates select="node()|@*" />
    </Lokal_test>
</xsl:template>

<!-- Creates a new 'Lokal_test' element if no 'Lokal' element exists -->
<xsl:template match="AdresGlownegoMiejscaWykonywaniaDzialalnosci[not(Lokal)]">
    <xsl:copy>
        <xsl:apply-templates select="node()/following-sibling::Wojewodztwo/preceding-sibling::*|@*" />
<!-- Copy nodes before 'Wojewodztwo' -->
        <Lokal_test />
        <xsl:apply-templates select="Wojewodztwo|Wojewodztwo/following-sibling::*|@*" />
<!-- Copy nodes after 'Wojewodztwo' (including) -->
    </xsl:copy>
</xsl:template>

...但是应用代码删除 AdresGlownegoMiejscaWykonywaniaDzialalnosci 也会删除 Lokal_test 标签。

<xsl:template match="InformacjeOWpisie/DaneAdresowe/AdresGlownegoMiejscaWykonywaniaDzialalnosci">
    <xsl:apply-templates select="@*|node()" />
</xsl:template>

请帮忙!

您可以通过在模板中匹配它们来删除不需要的元素,然后仅使用 <apply-templates> 进一步处理降序节点。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*" />           <!-- compact output -->

  <!-- identity template -->
  <xsl:template match="node()|@*">
      <xsl:copy>
          <xsl:apply-templates select="node()|@*" />
      </xsl:copy>
  </xsl:template>  

  <!-- Ignore two elements and only descend further -->
  <xsl:template match="AdresGlownegoMiejscaWykonywaniaDzialalnosci | DaneAdresowe">
    <xsl:apply-templates select="node()|@*" />
  </xsl:template>  

  <!-- Handles the replacement of the 'Lokal' element -->
  <xsl:template match="AdresGlownegoMiejscaWykonywaniaDzialalnosci/Lokal">
    <Lokal_test>
        <xsl:apply-templates select="node()|@*" />
    </Lokal_test>
  </xsl:template>

  <!-- Creates a new 'Lokal_test' element if no 'Lokal' element exists -->
  <xsl:template match="AdresGlownegoMiejscaWykonywaniaDzialalnosci[not(Lokal)]">
      <!-- Here the <xsl:copy> was removed -->
        <xsl:apply-templates select="node()/following-sibling::Wojewodztwo/preceding-sibling::*|@*" />
        <!-- Copy nodes before 'Wojewodztwo' -->
        <Lokal_test />
        <xsl:apply-templates select="Wojewodztwo|Wojewodztwo/following-sibling::*|@*" />
        <!-- Copy nodes after 'Wojewodztwo' (including) -->
      <!-- Here the <xsl:copy> was removed -->
  </xsl:template>

</xsl:stylesheet>