替换命名空间 - 具有命名空间的属性值的问题

发布于 2024-11-18 22:47:53 字数 1054 浏览 3 评论 0原文

我正在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ら栖息 2024-11-25 22:47:53

这里的问题是 nsold:aType 是属性的文本值;它没有命名空间,只是文本。您需要一个修改属性内容的模板。您可能需要根据您的需要进行调整,但这应该演示如何执行此操作:

<xsl:template match="@*[starts-with(.,'nsold:')]">
  <xsl:attribute name="{name()}">
    <xsl:value-of select="concat('ns3New:',substring-after(.,'nsold:'))" />
  </xsl:attribute>
</xsl:template>

这只需将任何属性的内容替换为以“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:

<xsl:template match="@*[starts-with(.,'nsold:')]">
  <xsl:attribute name="{name()}">
    <xsl:value-of select="concat('ns3New:',substring-after(.,'nsold:'))" />
  </xsl:attribute>
</xsl:template>

This simply substitutes the content of any attribute with text beginning in 'nsold:' with 'ns3New:etc.' instead.

假情假意假温柔 2024-11-25 22:47:53

执行此操作的“正确”方法可能是使用模式感知转换,它将 xsi:type 识别为 attribute(*, xs:QName) 类型。然后,您可以执行身份转换并辅以

<xsl:template match="attribute(*, xs:QName)">
  <xsl:attribute name="{local-name()}" namespace="{namespace-uri()}" 
     select="concat(f:new-prefix(namespace-uri-from-QName(.)), 
                    ':', local-name-from-QName(.))"/>
</xsl:template>

其中 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

<xsl:template match="attribute(*, xs:QName)">
  <xsl:attribute name="{local-name()}" namespace="{namespace-uri()}" 
     select="concat(f:new-prefix(namespace-uri-from-QName(.)), 
                    ':', local-name-from-QName(.))"/>
</xsl:template>

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文