【问题标题】:XSLT: create node if does not exists and simplify tags treeXSLT:如果不存在则创建节点并简化标签树
【发布时间】:2018-11-01 14:47:24
【问题描述】:

我知道已经有类似的问题,但似乎没有一个对我有用。尤其是在简化 XML 结构方面。

很快,我就有了带有标签“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>
    <Budynek>3a</Budynek>
    <Lokal_test/>
    <Wojewodztwo>podlaskie</Wojewodztwo>
  </InformacjeOWpisie>
  <InformacjeOWpisie>
    <Budynek>8r</Budynek>
    <Lokal_test>2</Lokal_test>
    <Wojewodztwo>mazowieckie</Wojewodztwo>
  </InformacjeOWpisie>
</Dane>

我已经在THIS 问题中询问了此代码。

以下代码有效:

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

请帮忙!

【问题讨论】:

    标签: xml xslt ms-access-2010 transformation


    【解决方案1】:

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

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

    【讨论】:

    • 一些更改适用于我的其余代码并且可以完美运行。我需要更多的 XSLT 类 :) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多