我必须创建翻译文档以回滚我们较新的消息正文。我能够回滚命名空间没有问题,但是回滚targetNamespace时遇到了问题。
在Java代码中,targetNamespace设置为new_namespace:1.1.0 传入的xml消息如下所示。
<env xmlns="original_cap_namespace" targetNamespace="new_namespace:1.1.0"</env>
我希望出站消息看起来像这样(将cap命名空间替换为new_namespace并删除taretNamespace上的版本控制)
<env xmlns="new_namespace" targetNamespace="new_namespace" </env>
这是我尝试过的。这可以用new_namespace替换original_cap_namespace。我似乎无法弄清楚如何从targetNamespace剥离版本或将targetNamespace设置为new_namespace,就像xmlns一样。我希望将xmlns和targetNamespace都设置为new_namespace。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="new_namespace"
xmlns:cap="original_cap_namespace"
exclude-result-prefixes="cap">
<xsl:output method="xml" indent="no" standalone="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*[local-name()='env']">
<env xmlns="new_namespace">
<xsl:apply-templates select="@* | node()"/>
</env>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
非常感谢。
答案 0 :(得分:1)
我似乎无法弄清楚如何从 targetNamespace或将targetNamespace设置为new_namespace 像xmlns。
targetNamespace
是一个属性,而不是名称空间声明,因此您可以这样做:
<xsl:template match="@targetNamespace">
<xsl:attribute name="targetNamespace">
<xsl:value-of select="substring-before(../@targetNamespace, ':')"/>
</xsl:attribute>
</xsl:template>
剥离版本,或者:
<xsl:template match="@targetNamespace">
<xsl:attribute name="targetNamespace">new_namespace</xsl:attribute>
</xsl:template>
将内容设置为已知字符串。
答案 1 :(得分:0)
此答案将涵盖您处理名称空间的方式。
您使用/*[local-name()='env']
作为模式,但您真正想要的是更改另一个特定名称空间下元素的名称空间。更像cap:env
。
另一个问题来自每个属性@*
的规则,该规则具有模板内容,该模板内容仅输出具有QName本地部分的属性。这样,您将丢失命名空间(甚至@xml:id
)下的任何属性
最后,每个元素*
的规则都会出现相同的属性问题:它仅保留QName的本地部分,这导致元素在默认名称空间下有效({文字结果元素new_namespace
中的{1}}。这样,您还将失去与env
不同词汇表中的任何元素。