使用xslt删除xsi:type

时间:2012-07-01 16:22:13

标签: xslt

我有以下XML。我能够删除所有名称空间,但无法使用XSL删除xsi:type。

XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<StudentResult xmlns='http://ns.xyz.org/2004-08-02' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:ns1='http://ns.xyz.org/2004-08-02' xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:type='ns1:StudentResult'>
<StudentId idOwner='xyz'><IdValue name='ClientId'>9103-XML</IdValue></StudentId>
<ClientOrderId idOwner='Cloud'><IdValue name='OrderNumber'>272454</IdValue></ClientOrderId>
<Results>false</Results>
</StudentResult>

期望的输出:

<?xml version="1.0" encoding="utf-8"?>
<StudentResult>
<StudentId idOwner="xyz"><IdValue name="ClientId">9103-XML</IdValue></StudentId>
<ClientOrderId idOwner="Cloud"><IdValue name="OrderNumber">272454</IdValue></ClientOrderId>
<Results>false</Results>
</StudentResult>

这是我使用的xslt,但没有用。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" encoding="utf-8" />
<xsl:template match="/|comment()|processing-instruction()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="/">    
<xsl:apply-templates select="@*|node()|processing-instruction()"/>
</xsl:template>
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:2)

添加模板

<xsl:template match="@xsi:type"/>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  exclude-result-prefixes="xsi">

在样式表的根元素上。

答案 1 :(得分:0)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()[not(self::*)]">
  <xsl:copy/>
 </xsl:template>

 <xsl:template match="*">
  <xsl:element name="{local-name()}">
   <xsl:apply-templates select="@*[not(name()='xsi:type')]|node()"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="@*">
  <xsl:attribute name="{local-name()}">
    <xsl:value-of select="."/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<StudentResult
 xmlns='http://ns.xyz.org/2004-08-02'
 xmlns:xsd='http://www.w3.org/2001/XMLSchema'
 xmlns:ns1='http://ns.xyz.org/2004-08-02'
 xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
 xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
 xsi:type='ns1:StudentResult'>
    <StudentId idOwner='xyz'>
        <IdValue name='ClientId'>9103-XML</IdValue>
    </StudentId>
    <ClientOrderId idOwner='Cloud'>
        <IdValue name='OrderNumber'>272454</IdValue>
    </ClientOrderId>
    <Results>false</Results>
</StudentResult>

会产生想要的正确结果:

<StudentResult>
   <StudentId idOwner="xyz">
      <IdValue name="ClientId">9103-XML</IdValue>
   </StudentId>
   <ClientOrderId idOwner="Cloud">
      <IdValue name="OrderNumber">272454</IdValue>
   </ClientOrderId>
   <Results>false</Results>
</StudentResult>