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>
我正在尝试格式化以下 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>