替换命名空间 - 具有命名空间的属性值的问题
我正在 XML 中从一个命名空间移动到另一个命名空间,并且我一直面临着类型化元素的 xsi:type 属性问题。 我一直在使用下一个模板,可以轻松地将具有一个命名空间的元素移动到另一个命名空间。
<xsl:template match="ent:*" >
<xsl:element name="ent:{local-name()}"
namespace="http://ns3">
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
但我无法将属于给定名称空间的属性值更新为 xsi:type 属性。
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ser:getAsByIdResponse xmlns:ser="http://osde.com.ar/services">
<return xmlns:xsi=".." xmlns:ns3New="http://ns3" xmlns:ns1New="http://ns2" xsi:type="nsold:aType"/>
</ser:getAsByIdResponse>
</soap:Body/>
</soap:Envelope>
在上面的示例中,我无法将“nsold:atype”更改为使用新名称空间的“ns3New:atype”。 有什么办法可以调整这种值吗?
i'm moving from one namespace to another in a XML and i have been facing problems with xsi:type attributes for typed elements.
I have been using next template that easily moves element that have one namespace to other one.
<xsl:template match="ent:*" >
<xsl:element name="ent:{local-name()}"
namespace="http://ns3">
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
but i'm not able to update attribute values that belongs to a given name space as xsi:type attribute.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ser:getAsByIdResponse xmlns:ser="http://osde.com.ar/services">
<return xmlns:xsi=".." xmlns:ns3New="http://ns3" xmlns:ns1New="http://ns2" xsi:type="nsold:aType"/>
</ser:getAsByIdResponse>
</soap:Body/>
</soap:Envelope>
In above example, i can't change "nsold:atype" to one like "ns3New:atype" that uses the new name spaces.
Is there any way to do adjust this kind of values?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这里的问题是 nsold:aType 是属性的文本值;它没有命名空间,只是文本。您需要一个修改属性内容的模板。您可能需要根据您的需要进行调整,但这应该演示如何执行此操作:
这只需将任何属性的内容替换为以“nsold:”开头的文本,然后将其替换为“ns3New:etc”。反而。
Your problem here is that
nsold:aType
is the textual value of the attribute; It doesn't have a namespace, it's just text. You need a template that modifies the content of the attribute. You might need to adapt it to your needs, but this should demonstrate how to do this:This simply substitutes the content of any attribute with text beginning in 'nsold:' with 'ns3New:etc.' instead.
执行此操作的“正确”方法可能是使用模式感知转换,它将 xsi:type 识别为 attribute(*, xs:QName) 类型。然后,您可以执行身份转换并辅以
其中 f:new-prefix() 是将 QName 的命名空间 URI 映射到要在新文档中使用的前缀的函数。
但是,如果 xsi:type 是您唯一的名称空间敏感内容,那么您可以将其作为特殊情况处理。
The "correct" way to do this is probably with a schema-aware transformation, which recognizes the xsi:type as being of type attribute(*, xs:QName). You can then do an identity transformation supplemented with
where f:new-prefix() is a function that maps the namespace URI of the QName to the prefix to be used in the new document.
However, if xsi:type is your only namespace-sensitive content, then you could just handle it as a special case.