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>

上記のxmlから必要な情報を抽出するための私のXSL:

<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 に答える