仅在根节点添加前缀 NS0
Posted
技术标签:
【中文标题】仅在根节点添加前缀 NS0【英文标题】:Add prefix NS0 only in the root node 【发布时间】:2019-03-31 07:33:21 【问题描述】:大家好,
请帮帮我!我只需要在 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 做到这一点?
【问题讨论】:
你能确认这正是你想要做的吗?在第一个 XML 中,所有元素都在命名空间“xxx/yyy/v1”中,但在第二个 XML 中,只有 RootNode 在该命名空间中,所有其他元素都不在命名空间中,因此两个 XML 文档不等价。谢谢! 你好,蒂姆!这是问题所在,根元素和其他元素不在同一个命名空间中。 【参考方案1】:你有两件事要做。
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>
【讨论】:
以上是关于仅在根节点添加前缀 NS0的主要内容,如果未能解决你的问题,请参考以下文章
如何检查某个用户是不是在根节点上具有 Write, read 权限