XSLT: создать узел, если не существует, и упростить дерево тегов - PullRequest
0 голосов
/ 22 мая 2018

Я знаю, что подобные вопросы уже есть, но ни один из них, похоже, не работает для меня.Особенно, когда речь идет об упрощении структуры XML.

Итак, в скором времени у меня есть файл XML с тегом "Lokal", который в большинстве случаев не появляется, но должен.Не облегчая ситуацию: мне также нужно изменить имя «Lokal», скажем, «Lokal_test».Моя цель - изменить имя узла (если существует) или создать его и переименовать (если не существует).Данные из XML будут импортированы в данные MS 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>

Я уже просил этот код в ЭТОМ вопросе.

Код ниже работал:

<!-- 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>

Пожалуйста, помогите!

1 Ответ

0 голосов
/ 22 мая 2018

Вы можете удалить ненужные элементы, сопоставив их в шаблоне, а затем использовать только <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>
...