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

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

Итак, у меня есть 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>
    <DaneAdresowe>
      <AdresGlownegoMiejscaWykonywaniaDzialalnosci>
        <Budynek>3a</Budynek>
        <Lokal_test/>
        <Wojewodztwo>podlaskie</Wojewodztwo>
      </AdresGlownegoMiejscaWykonywaniaDzialalnosci>
    </DaneAdresowe>
    </InformacjeOWpisie>
    <InformacjeOWpisie>
      <DaneAdresowe>
        <AdresGlownegoMiejscaWykonywaniaDzialalnosci>
          <Budynek>8r</Budynek>
          <Lokal_test>2</Lokal_test>
          <Wojewodztwo>mazowieckie</Wojewodztwo>
        </AdresGlownegoMiejscaWykonywaniaDzialalnosci>
      </DaneAdresowe>
      </InformacjeOWpisie>
</Dane>

Этот вопрос ( XSLT: создать узел, если он не существует , казалось, был больше в моих проблемах, но при попытке использовать его не работает. Неуверен почему?

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

РЕДАКТИРОВАТЬ:
Когда я избавляюсь от родителя Lokal_test исчезает. Я использую код ниже, чтобы сказать "пока" родителю:

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

Ответы [ 2 ]

0 голосов
/ 22 мая 2018
<xsl:template match="@*|node()">
       <xsl:copy>
           <xsl:apply-templates select="@*|node()"/>
       </xsl:copy>
   </xsl:template>

    <xsl:template match="AdresGlownegoMiejscaWykonywaniaDzialalnosci/Budynek">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
            <xsl:choose>
                <xsl:when test="exists(following-sibling::Lokal)">
                    <Lokal_test>
                    <xsl:value-of select="following-sibling::Lokal"/>
                    </Lokal_test>
                </xsl:when>
                <xsl:when test="not(following-sibling::Lokal)">

                    <xsl:element name="Lokal_test"/>
            </xsl:when>
            </xsl:choose>


    </xsl:template>
    <xsl:template match="Lokal"/>
0 голосов
/ 22 мая 2018

Ваш подход был правильным, но неполным.Вы только создали новый элемент Local_test.

Так что попробуйте эти два шаблона в сочетании с шаблоном идентификации :

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

Второй шаблон помещает Lokal_test element before элемент Wojewodztwo и копирование окружающих узлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...