xml - 仅在根节点添加前缀 NS0
问题描述
嗨伙计们,
请帮我!我只需要在 XML 的第一个节点中包含命名空间前缀,其他节点必须没有前缀和命名空间。请参见下面的示例。
前:
<RootNode xmlns="https://xxx/yyy/v1">
<CreatedBy>admin</CreatedBy>
<Task>
<Number>1</Number>
<Status>-1</Status>
<Name>Fechada</Name>
</Task>
</RootNode>
后:
<ns0:RootNode xmlns:ns0="https://xxx/yyy/v1">
<CreatedBy>admin</CreatedBy>
<Task>
<Number>1</Number>
<Status>-1</Status>
<Name>Fechada</Name>
</Task>
</ns0:RootNode>
如何使用 XSL 做到这一点?
解决方案
你有两件事要在这里做。
1) 为根元素添加命名空间前缀。这可以通过以下模板完成
<xsl:template match="/*">
<xsl:element name="ns0:{local-name()}" namespace="{namespace-uri()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
2) 对于所有其他元素,创建具有相同名称但没有命名空间的元素。这可以通过以下方式完成
<xsl:template match="*/*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
将所有这些与处理其他所有内容的标识模板放在一起,为您提供以下 XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:element name="ns0:{local-name()}" namespace="{namespace-uri()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
<xsl:template match="*/*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- sparql - 过滤 URL 值
- java - 在 Spring boot JWT Plus Oauth2 中,TokenStore findTokensByClientId(clientId) 返回空白数组(我想要活动令牌)
- python - 半金字塔数列倍数
- c++ - 如何从看起来像这样的文件中读取特定数据?
- android - 如何在android中从本地url加载pdf文件
- reactjs - 如何将 className 传递给`h${headingLevel}` 自定义标签
- c# - Thread 中的 join() 方法实际上在做什么?
- react-native - 有没有办法“淡入”平面列表中的项目?
- ldap - 错误 [LDAP:错误代码 65 - 属性“calFBURL”不允许]
- vba - 运行时错误“70”:权限仅在 Word VBA 中被拒绝