首页 > 解决方案 > XSL 删除空子节点,但如果没有子节点,则创建一个

问题描述

我正在尝试格式化以下 XML,删除所有为空的“参数”节点(没有“键”子节点),但如果全部为空,我需要创建一个。假设我需要为每个“覆盖”至少有一个“参数”节点

输入 XML:

<root>
   <coverages>
      <parameters> 
        <enumValues/>
      </parameters>
      <parameters>
        <enumValues/>
      </parameters>
      <parameters>
        <enumValues/>
      </parameters>
      <id>P01</id>
      <name>P01 coverage</name>
      <parameters>
        <key>key1</key>
        <name>Key1 Name</name>
        <defaultValue>1</defaultValue>
      </parameters>
   </coverages>
   <coverages>
      <parameters>
        <enumValues/>
      </parameters>
      <parameters>
        <enumValues/>
      </parameters>
      <parameters>
        <enumValues/>
      </parameters>
      <id>P03</id>
      <name>P03 coverage</name>
   </coverages>
</root>

预期的输出是:

<root>
    <coverages>
        <id>P01</id>
        <name>P01 coverage</name>
        <parameters>
            <key>key1</key>
            <name>Key1 Name</name>
            <defaultValue>1</defaultValue>
        </parameters>
    </coverages>
    <coverages>
        <id>P03</id>
        <name>P03 coverage</name>
        <parameters>
            <key>key2</key>
            <name>Key2 Name</name>
            <defaultValue>2</defaultValue>
        </parameters>
    </coverages>
</root>

我实际上坚持使用要应用的转换,因为我可以轻松删除空节点,但是我不知道如何添加一个

我正在使用以下模板:

<xsl:template match="coverages/parameters[not(descendant::key[not(*)][normalize-space()])]" />

但这只是删除了空的

标签: xmlxslt-1.0

解决方案


尝试类似:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="parameters[not(key)]"/>

<xsl:template match="coverages[not(parameters/key)]">
    <xsl:copy>
        <xsl:apply-templates/>
        <parameters>
            <key>some value</key>
            <name>some value</name>
            <defaultValue>some value</defaultValue>
        </parameters>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

推荐阅读