我正在尝试格式化以下XML,删除所有为空的"parameters"节点(没有"key"子节点(,但如果所有节点都为空,我需要创建一个。假设我需要为每个"覆盖范围"至少有一个"参数"节点
输入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>