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>
我知道类似的问题已经存在,但其中 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>