使用XSLT从XML中的选择性节点中删除选择性的其他名称空间



感谢stack Overflow和 @Michael.hor257k,我能够在我的XML文档中成功更新名称空间。

现在,只有一个问题。
我的SAP系统无法理解XSD的几个字段,因此添加了自己的名称空间以适应XML模式。

这是可以通过SAP解决的,但是我们还没有安装该软件(Sproxy)。

所以,我必须使用XSLT 1.0实现此目标。

我的原始XML是:

    <?xml version="1.0" encoding="UTF-8"?>
<n0:eCPR xmlns:prx="urn:sap.com:proxy:DV4:/1SAI/TAS1F59A417878D36573F1D:700:2013/05/24" xmlns:n0="http://www.dir.ca.gov/dlse/CPR-Prod-Test/CPR.xsd">
<n0:employees>
  <n0:employee>
    <n0:name id="20019768">Paul John</n0:name>
</n0:employee>
</n0:employees>
</n0:eCPR>

和用于达到以下所需输出的XSLT:

   <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:CPR="http://www.dir.ca.gov/dlse/CPR-Prod-Test/CPR.xsd">
 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
 <xsl:strip-space elements="*"/>
   <xsl:template match="*">
     <xsl:element name="CPR:{local-name()}">
    <xsl:copy-of select="@*"/>
     <xsl:apply-templates/>
   </xsl:element>
   </xsl:template>

使用当前名称空间MY XML(错误是)看起来像

<?xml version="1.0" encoding="UTF-8"?>
<CPR:eCPR xmlns:CPR="http://www.dir.ca.gov/dlse/CPR-Prod-Test/CPR.xsd">
 <CPR:projectInfo>
  <CPR:awardingBody xmlns:asx="http://www.sap.com/abapxml" asx:root=""/>
  <CPR:contractAgencyID xmlns:asx="http://www.sap.com/abapxml" asx:root=""/>
  <CPR:contractAgency/>
  <CPR:projectName xmlns:asx="http://www.sap.com/abapxml" asx:root=""/>
  <CPR:projectID/>
  <CPR:awardingBodyID/>
  <CPR:projectNum/>
  <CPR:contractID/>

因此,节点awardingBodycontractAgencyIDProject Name是系统无法正确转换的字段。(带有xmlns:asx名称空间的节点)

我需要删除这些名称空间。是否可以通过XSLT。条件:仅删除名称空间为http://www.sap.com/abapxml或我可以提供节点的名称(由于修复了)

>

理想结构应该是什么:

<?xml version="1.0" encoding="UTF-8"?>
<CPR:eCPR xmlns:CPR="http://www.dir.ca.gov/dlse/CPR-Prod-Test/CPR.xsd">
 <CPR:projectInfo>
  <CPR:awardingBody/>
  <CPR:contractAgencyID />
  <CPR:contractAgency/>
  <CPR:projectName/>
  <CPR:projectID/>
  <CPR:awardingBodyID/>
  <CPR:projectNum/>
  <CPR:contractID/>

谢谢

我猜你原来的XML实际上看起来像这样:

XML

<n0:eCPR xmlns:n0="http://www.dir.ca.gov/dlse/CPR-Prod-Test/CPR.xsd" xmlns:asx="http://www.sap.com/abapxml">
    <n0:projectInfo>
        <n0:awardingBody asx:root=""/>
        <n0:contractAgencyID asx:root=""/>
        <n0:contractAgency/>
        <n0:projectName asx:root=""/>
        <n0:projectID/>
        <n0:awardingBodyID/>
        <n0:projectNum/>
        <n0:contractID/>
    </n0:projectInfo>
</n0:eCPR>

为了获取请求的输出 - 即不复制asx:root属性 - 您需要做:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:CPR="http://www.dir.ca.gov/dlse/CPR-Prod-Test/CPR.xsd">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
    <xsl:element name="CPR:{local-name()}">
    <xsl:copy-of select="@*[not(namespace-uri()='http://www.sap.com/abapxml')]"/>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

或也许是:

<xsl:copy-of select="@*[not(namespace-uri())]"/>

要删除不在无名空间中的任何属性。

相关内容

最新更新