在xsl中调整targetNamespace

时间:2019-03-21 17:30:10

标签: xml xslt

我必须创建翻译文档以回滚我们较新的消息正文。我能够回滚命名空间没有问题,但是回滚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>

非常感谢。

2 个答案:

答案 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不同词汇表中的任何元素。