首页 > 解决方案 > XSLT:如果不存在则创建节点

问题描述

我知道类似的问题已经存在,但似乎没有一个对我有用。

很快,我就有了带有标签“Lokal”的 XML 文件,在大多数情况下它不会出现,但它应该出现。没有让事情变得更容易:我还需要将“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: create node if not exists似乎是我的问题的原因,但是在尝试使用它时不起作用。不知道为什么?

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

标签: xsltxml-parsing

解决方案


<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"/>

推荐阅读