1

我在使用 XSLT 从 XML 中提取信息时遇到了问题。命名空间也出现在输出中,这是不可接受的。

我从另一个系统收到的 XML

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>  
        <ns1:DeptResponse xmlns:ns1="http://samplecomp.com" xmlns="http://mycomp.org">
            <Department>
                <Building bid="b_1579">
                <DeptName>Sports</DeptName>
                <DeptHead>
                    <Person pid="123">
                        <Name>David Shephard</Name>
                        <Address>
                            <Street>Test</Street>
                            <State code="18">Georgia</State>            
                        </Address>              
                    </Person>
                </DeptHead>
                <DeptYear>1925</DeptYear>
            </Department>
        </ns1:DeptResponse>
    </soap:Body>
</soap:Envelope>

我的 XSL 从上述 xml 中提取所需信息:

<xsl:stylesheet version="2.0"      
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"    
    xmlns:ns1="http://samplecomp.com" 
    xmlns:dept="http://mycomp.org"
    exclude-result-prefixes="ns1 xsl dept">  

    <xsl:template match="/">         
        <xsl:apply-templates select="//dept:Person"/>     
    </xsl:template>
    <xsl:template match="@*|node()">        
        <xsl:copy copy-namespaces="no"  >             
            <xsl:apply-templates select="@*|node()"/>        
        </xsl:copy>    
    </xsl:template> 
</xsl:stylesheet>

我在 XSL 之后收到的响应:响应包含一个 xmlns:="http://myccomp.org" 我想摆脱它。我试过使用 copy-namespaces="no" 但没用。:(

<Person xmlns="http://mycomp.org" pid="123">
    <Name>David Shephard</Name>
    <Address>
        <Street>Test</Street>
        <State code="18">Georgia</State>            
    </Address>
</Person>

请帮我。

提前致谢。

4

3 回答 3

2
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"    
    xmlns:ns1="http://samplecomp.com" 
    xmlns:dept="http://mycomp.org"
    exclude-result-prefixes="ns1 xsl dept">
<xsl:output method="xml"/>
   <xsl:template match="/">         
        <xsl:apply-templates select="//dept:Person"/>     
    </xsl:template>   
     <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="@*">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="."/>
    </xsl:attribute>
</xsl:template> 
</xsl:stylesheet>
于 2012-10-29T14:25:45.307 回答
2

好吧,如果您使用xsl:copy创建上下文节点的副本,则在元素的情况下,这意味着您创建一个具有相同名称的元素,并且该名称由命名空间和本地名称组成。copy-namespaces="no"仅有助于不复制范围内的任何其他名称空间,但不会更改要复制的元素的名称。因此,在您的情况下,您想要将元素从某个命名空间转换为具有相同本地名称但没有命名空间的元素,即

<xsl:template match="dept:*">
  <xsl:element name="{local-name()}">
    <xsl:apply-templates select="@* | node()"/>
  </xsl:element>
</xsl:template>
于 2012-10-29T14:30:53.080 回答
1

xsl:copy将包括绑定到该元素的命名空间。copy-namespaces="no"只会从文档中排除在被复制的上下文元素中未使用的无关名称空间。

如果要在输出中创建未绑定到命名空间的元素(或属性),则需要使用它们作为@name重新构成元素xsl:element和新属性:xsl:attributelocal-name()

 <xsl:stylesheet version="2.0"      
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"    
    xmlns:ns1="http://samplecomp.com" 
    xmlns:dept="http://mycomp.org"
    exclude-result-prefixes="ns1 xsl dept">  

    <xsl:template match="/">         
        <xsl:apply-templates select="//dept:Person"/>     
    </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()}" select="." />  
    </xsl:template> 

    <xsl:template match="text()|processing-instruction()|comment()">        
        <xsl:copy>             
            <xsl:apply-templates select="@*|node()"/>        
        </xsl:copy>    
    </xsl:template> 

</xsl:stylesheet>
于 2012-10-29T14:27:11.033 回答