1

我正在 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”。有什么办法可以调整这种值吗?

4

2 回答 2

1

执行此操作的“正确”方法可能是使用模式感知转换,它将 xsi:type 识别为类型属性 (*, 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 是您唯一的命名空间敏感内容,那么您可以将其作为特殊情况处理。

于 2011-07-05T10:00:11.407 回答
1

您的问题是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”。反而。

于 2011-07-05T09:52:00.587 回答