XSL 删除空子节点,但如果没有子节点,则创建一个

XSL remove empty child nodes but if no child create one

我正在尝试格式化以下 XML 删除所有空的 "parameters" 节点(没有 "key" 子节点)但是如果所有的都是空的我需要创建一个. 假设我需要为每个 "coverage"

至少有一个 "parameters" 节点

输入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()])]" />

但这只是删除了空的

试试这样的:

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>