使用XSLT在XML中使用多级和多个命名空间

时间:2017-01-05 11:13:50

标签: xml xslt

我是XSLT的新手。我需要像这样创建一个XML。

 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
      <s:Body>
        <GetRecordResponse xmlns="urn:RedIron.RetailRepository.Services.SearchService">
          <GetRecordResult xmlns:a="urn:RedIron.RetailRepository.Core" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

我能够将xml生成到这个lavel。但由于使用了多个lavel命名空间,我感到困惑。

  <?xml version="1.0" encoding="UTF-8"?>
        <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
            <s:Body>
                <GetRecordResponse xmlns="urn:RedIron.RetailRepository.Services.SearchService"/>
            </s:Body>
        </s:Envelope>

我正在使用此XSLT进行相同的

 <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
      version="2.0">
    <xsl:output indent="yes"/>
     <xsl:template match = "/" > 
         <s:Envelope > 
           <s:Body>
            <xsl:element name = "GetRecordResponse" namespace = "urn:RedIron.RetailRepository.Services.SearchService" > 
            </xsl:element> 
            </s:Body>
          </s:Envelope>             
       </xsl:template> 
    </xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

如果要添加这些命名空间节点,可以使用xsl:namespace。这仅适用于支持XSLT2.0的处理器。

<xsl:element name="GetRecordResponse" namespace="urn:RedIron.RetailRepository.Services.SearchService"> 
    <xsl:element name="GetRecordResult" namespace="urn:RedIron.RetailRepository.Services.SearchService">
        <xsl:namespace name="a" select="'urn:RedIron.RetailRepository.Core'" />
        <xsl:namespace name="i" select="'http://www.w3.org/2001/XMLSchema-instance'" />
    </xsl:element>
</xsl:element> 

或者,您可以直接写出元素名称和命名空间声明

<GetRecordResponse xmlns="urn:RedIron.RetailRepository.Services.SearchService" > 
    <GetRecordResult xmlns:a="urn:RedIron.RetailRepository.Core" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" />
</GetRecordResponse> 

请注意,例如,如果将GetRecordResult的创建移动到其他模板,则可能需要在其上指定默认命名空间,因为它将不再继承GetRecordResponse的默认名称。

 <GetRecordResult xmlns="urn:RedIron.RetailRepository.Services.SearchService"  
    xmlns:a="urn:RedIron.RetailRepository.Core" 
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance" />