xml - 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()])]" />
但这只是删除了空的
解决方案
尝试类似:
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>
推荐阅读
- ios - flutter_facebook_login 插件在 iOS 模拟器上登录问题(使用 Android Studio)
- java - Hibernate:将属性字段设置为静态最终对象实例
- c# - 使用 RealObject 在 Xamarin.Forms 中进行数据绑定
- android-studio - Kotlin - Parcelable 类型不匹配:必需:字符串,找到:字符串?
- typescript - Clean Architecture 中的双向事件流
- wordpress - Wordpress CPT(自定义帖子类型)和 URL
- mvvm - 使用 Dagger 时我们真的需要 viewModelFactories 和 viewmodelProviders 吗?
- css - 为什么当我重新加载页面时我的 css 动画会出现在我的窗口之外,但在我最初加载页面时却没有?
- typescript - 打字稿键值关系保留 Object.entries 类型
- java - 如何为 JavaFX 图表系列着色