如何使用xslt删除名称空间并更新输出元素

如何使用xslt删除名称空间并更新输出元素,xslt,cdata,Xslt,Cdata,我有一个XML元素,需要使用XSLT将其转换为不同的形式。我已经在下面发布了请求和响应xml。我是XSLT新手,需要帮助将请求转换为响应格式 请求: <p:ReservationRequest xmlns:p="http://sample.request.com/"> <!--Exactly 1 occurrence--> <p:Reservation> <p:tktReservationGUID>1357

我有一个XML元素,需要使用XSLT将其转换为不同的形式。我已经在下面发布了请求和响应xml。我是XSLT新手,需要帮助将请求转换为响应格式

请求:

<p:ReservationRequest xmlns:p="http://sample.request.com/">
      <!--Exactly 1 occurrence-->
      <p:Reservation>
         <p:tktReservationGUID>13579</p:tktReservationGUID>
         <p:tktState>CA</p:tktState>
         <p:LocationId>1357</p:LocationId>
      </p:Reservation>
   </p:ReservationRequest>

13579
加利福尼亚州
1357
答复:

  <tem:SendReservation xmlns:tem="http://tempuri.org/">
     <!--Optional:-->
     <tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
     <!--Optional:-->
     <tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
     <!--Optional:-->
     <tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
     <!--Optional:-->
     <tem:Data><![CDATA[<DATA> <Reservation>

     <tktReservationGUID>54321</tktReservationGUID>
     <tktState>CA</tktState>
     <LocationId>1357</LocationId>
  </Reservation> </DATA>]]></tem:Data>
  </tem:SendReservation>
<tem:SendReservation xmlns:tem="http://tempuri.org/">
   <tem:ProviderGuid>1111</tem:ProviderGuid>
   <tem:Username>usertest</tem:Username>
   <tem:Password>passtest</tem:Password>
   <tem:Data><![CDATA[<DATA>
      <Reservation>
         <tktReservationGUID>13579</tktReservationGUID>
         <tktState>CA</tktState>
         <LocationId>1357</LocationId>
      </Reservation>
</DATA>]]></tem:Data>
</tem:SendReservation>

1111
用户文本
密码文本
54321
加利福尼亚州
1357
]]>
在将另一个主元素“DATA”附加到请求元素之后,我需要将名称空间从请求元素中剥离出来,并在“tem:DATA”下的响应中使用CDATA附加它们

我非常感谢您在使用XSLT将以下请求转换为已发布的响应方面提供的帮助

问候,,
Rudraksh

假设XSLT 3.0和Saxon 9.6,您可以使用
序列化
函数将转换后的临时树转换为标记:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:p="http://sample.request.com/"
  xmlns:tem="http://tempuri.org/"
  exclude-result-prefixes="p tem"
  version="3.0">

<xsl:output indent="yes" cdata-section-elements="tem:Data" omit-xml-declaration="yes"/>

<xsl:template match="/">
  <tem:SendReservation xmlns:tem="http://tempuri.org/">
     <!--Optional:-->
     <tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
     <!--Optional:-->
     <tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
     <!--Optional:-->
     <tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
     <!--Optional:-->
     <tem:Data>
       <xsl:variable name="data">
         <DATA>
           <xsl:apply-templates select="p:ReservationRequest"/>
         </DATA>
       </xsl:variable>
       <xsl:variable name="ser-params">
          <output:serialization-parameters
                 xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization">
            <output:indent value="yes"/>
            <output:version value="1.0"/>
            <output:method value="xml"/>
            <output:omit-xml-declaration value="yes"/>
          </output:serialization-parameters>
       </xsl:variable>
       <xsl:value-of select="serialize($data/*, $ser-params/*)"/>
     </tem:Data>
   </tem:SendReservation>
</xsl:template>

<xsl:template match="p:*">
  <xsl:element name="{local-name()}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

假设XSLT 3.0和Saxon 9.6,您可以使用
serialize
函数将转换后的临时树转换为标记:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:p="http://sample.request.com/"
  xmlns:tem="http://tempuri.org/"
  exclude-result-prefixes="p tem"
  version="3.0">

<xsl:output indent="yes" cdata-section-elements="tem:Data" omit-xml-declaration="yes"/>

<xsl:template match="/">
  <tem:SendReservation xmlns:tem="http://tempuri.org/">
     <!--Optional:-->
     <tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
     <!--Optional:-->
     <tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
     <!--Optional:-->
     <tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
     <!--Optional:-->
     <tem:Data>
       <xsl:variable name="data">
         <DATA>
           <xsl:apply-templates select="p:ReservationRequest"/>
         </DATA>
       </xsl:variable>
       <xsl:variable name="ser-params">
          <output:serialization-parameters
                 xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization">
            <output:indent value="yes"/>
            <output:version value="1.0"/>
            <output:method value="xml"/>
            <output:omit-xml-declaration value="yes"/>
          </output:serialization-parameters>
       </xsl:variable>
       <xsl:value-of select="serialize($data/*, $ser-params/*)"/>
     </tem:Data>
   </tem:SendReservation>
</xsl:template>

<xsl:template match="p:*">
  <xsl:element name="{local-name()}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

假设XSLT 3.0和Saxon 9.6,您可以使用
serialize
函数将转换后的临时树转换为标记:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:p="http://sample.request.com/"
  xmlns:tem="http://tempuri.org/"
  exclude-result-prefixes="p tem"
  version="3.0">

<xsl:output indent="yes" cdata-section-elements="tem:Data" omit-xml-declaration="yes"/>

<xsl:template match="/">
  <tem:SendReservation xmlns:tem="http://tempuri.org/">
     <!--Optional:-->
     <tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
     <!--Optional:-->
     <tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
     <!--Optional:-->
     <tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
     <!--Optional:-->
     <tem:Data>
       <xsl:variable name="data">
         <DATA>
           <xsl:apply-templates select="p:ReservationRequest"/>
         </DATA>
       </xsl:variable>
       <xsl:variable name="ser-params">
          <output:serialization-parameters
                 xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization">
            <output:indent value="yes"/>
            <output:version value="1.0"/>
            <output:method value="xml"/>
            <output:omit-xml-declaration value="yes"/>
          </output:serialization-parameters>
       </xsl:variable>
       <xsl:value-of select="serialize($data/*, $ser-params/*)"/>
     </tem:Data>
   </tem:SendReservation>
</xsl:template>

<xsl:template match="p:*">
  <xsl:element name="{local-name()}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

假设XSLT 3.0和Saxon 9.6,您可以使用
serialize
函数将转换后的临时树转换为标记:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:p="http://sample.request.com/"
  xmlns:tem="http://tempuri.org/"
  exclude-result-prefixes="p tem"
  version="3.0">

<xsl:output indent="yes" cdata-section-elements="tem:Data" omit-xml-declaration="yes"/>

<xsl:template match="/">
  <tem:SendReservation xmlns:tem="http://tempuri.org/">
     <!--Optional:-->
     <tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
     <!--Optional:-->
     <tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
     <!--Optional:-->
     <tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
     <!--Optional:-->
     <tem:Data>
       <xsl:variable name="data">
         <DATA>
           <xsl:apply-templates select="p:ReservationRequest"/>
         </DATA>
       </xsl:variable>
       <xsl:variable name="ser-params">
          <output:serialization-parameters
                 xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization">
            <output:indent value="yes"/>
            <output:version value="1.0"/>
            <output:method value="xml"/>
            <output:omit-xml-declaration value="yes"/>
          </output:serialization-parameters>
       </xsl:variable>
       <xsl:value-of select="serialize($data/*, $ser-params/*)"/>
     </tem:Data>
   </tem:SendReservation>
</xsl:template>

<xsl:template match="p:*">
  <xsl:element name="{local-name()}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

我能够稍微更改输入请求,使其与我的响应非常相似。我在下面发布了我的新请求以及用于转换它的XSLT

新要求:

<p:ReservationRequest xmlns:p="http://sample.request.com/">
  <p:DATA>
      <!--Exactly 1 occurrence-->
      <p:Reservation>
         <p:tktReservationGUID>13579</p:tktReservationGUID>
         <p:tktState>CA</p:tktState>
         <p:LocationId>1357</p:LocationId>
      </p:Reservation>
  </p:DATA>
</p:ReservationRequest>

13579
加利福尼亚州
1357
新XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tem="http://tempuri.org/" xmlns:p="http://sample.request.com/" exclude-result-prefixes="p tem" version="1.0">
      <xsl:output indent="yes" cdata-section-elements="tem:Data"/>
      <xsl:template match="/">
         <tem:SendReservation>
            <!--Optional:-->
            <tem:ProviderGuid>1111</tem:ProviderGuid>
            <!--Optional:-->
            <tem:Username>usertest</tem:Username>
            <!--Optional:-->
            <tem:Password>passtest</tem:Password>
            <!--Optional:-->
            <tem:Data>
               <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
               <xsl:apply-templates select="/p:ReservationRequest/p:DATA"></xsl:apply-templates>
               <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
            </tem:Data>
         </tem:SendReservation>
      </xsl:template>
      <xsl:template match="*">
         <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|node()"></xsl:apply-templates>
         </xsl:element>
      </xsl:template>
      <xsl:template match="@*">
         <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."></xsl:value-of>
         </xsl:attribute>
      </xsl:template>
   </xsl:stylesheet>

1111
用户测试
通过测试
![CDATA[
]]
答复:

  <tem:SendReservation xmlns:tem="http://tempuri.org/">
     <!--Optional:-->
     <tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
     <!--Optional:-->
     <tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
     <!--Optional:-->
     <tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
     <!--Optional:-->
     <tem:Data><![CDATA[<DATA> <Reservation>

     <tktReservationGUID>54321</tktReservationGUID>
     <tktState>CA</tktState>
     <LocationId>1357</LocationId>
  </Reservation> </DATA>]]></tem:Data>
  </tem:SendReservation>
<tem:SendReservation xmlns:tem="http://tempuri.org/">
   <tem:ProviderGuid>1111</tem:ProviderGuid>
   <tem:Username>usertest</tem:Username>
   <tem:Password>passtest</tem:Password>
   <tem:Data><![CDATA[<DATA>
      <Reservation>
         <tktReservationGUID>13579</tktReservationGUID>
         <tktState>CA</tktState>
         <LocationId>1357</LocationId>
      </Reservation>
</DATA>]]></tem:Data>
</tem:SendReservation>

1111
用户测试
通过测试
13579
加利福尼亚州
1357
]]>

我能够稍微更改输入请求,使其与我的响应非常相似。我在下面发布了我的新请求以及用于转换它的XSLT

新要求:

<p:ReservationRequest xmlns:p="http://sample.request.com/">
  <p:DATA>
      <!--Exactly 1 occurrence-->
      <p:Reservation>
         <p:tktReservationGUID>13579</p:tktReservationGUID>
         <p:tktState>CA</p:tktState>
         <p:LocationId>1357</p:LocationId>
      </p:Reservation>
  </p:DATA>
</p:ReservationRequest>

13579
加利福尼亚州
1357
新XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tem="http://tempuri.org/" xmlns:p="http://sample.request.com/" exclude-result-prefixes="p tem" version="1.0">
      <xsl:output indent="yes" cdata-section-elements="tem:Data"/>
      <xsl:template match="/">
         <tem:SendReservation>
            <!--Optional:-->
            <tem:ProviderGuid>1111</tem:ProviderGuid>
            <!--Optional:-->
            <tem:Username>usertest</tem:Username>
            <!--Optional:-->
            <tem:Password>passtest</tem:Password>
            <!--Optional:-->
            <tem:Data>
               <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
               <xsl:apply-templates select="/p:ReservationRequest/p:DATA"></xsl:apply-templates>
               <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
            </tem:Data>
         </tem:SendReservation>
      </xsl:template>
      <xsl:template match="*">
         <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|node()"></xsl:apply-templates>
         </xsl:element>
      </xsl:template>
      <xsl:template match="@*">
         <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."></xsl:value-of>
         </xsl:attribute>
      </xsl:template>
   </xsl:stylesheet>

1111
用户测试
通过测试
![CDATA[
]]
答复:

  <tem:SendReservation xmlns:tem="http://tempuri.org/">
     <!--Optional:-->
     <tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
     <!--Optional:-->
     <tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
     <!--Optional:-->
     <tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
     <!--Optional:-->
     <tem:Data><![CDATA[<DATA> <Reservation>

     <tktReservationGUID>54321</tktReservationGUID>
     <tktState>CA</tktState>
     <LocationId>1357</LocationId>
  </Reservation> </DATA>]]></tem:Data>
  </tem:SendReservation>
<tem:SendReservation xmlns:tem="http://tempuri.org/">
   <tem:ProviderGuid>1111</tem:ProviderGuid>
   <tem:Username>usertest</tem:Username>
   <tem:Password>passtest</tem:Password>
   <tem:Data><![CDATA[<DATA>
      <Reservation>
         <tktReservationGUID>13579</tktReservationGUID>
         <tktState>CA</tktState>
         <LocationId>1357</LocationId>
      </Reservation>
</DATA>]]></tem:Data>
</tem:SendReservation>

1111
用户测试
通过测试
13579
加利福尼亚州
1357
]]>

我能够稍微更改输入请求,使其与我的响应非常相似。我在下面发布了我的新请求以及用于转换它的XSLT

新要求:

<p:ReservationRequest xmlns:p="http://sample.request.com/">
  <p:DATA>
      <!--Exactly 1 occurrence-->
      <p:Reservation>
         <p:tktReservationGUID>13579</p:tktReservationGUID>
         <p:tktState>CA</p:tktState>
         <p:LocationId>1357</p:LocationId>
      </p:Reservation>
  </p:DATA>
</p:ReservationRequest>

13579
加利福尼亚州
1357
新XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tem="http://tempuri.org/" xmlns:p="http://sample.request.com/" exclude-result-prefixes="p tem" version="1.0">
      <xsl:output indent="yes" cdata-section-elements="tem:Data"/>
      <xsl:template match="/">
         <tem:SendReservation>
            <!--Optional:-->
            <tem:ProviderGuid>1111</tem:ProviderGuid>
            <!--Optional:-->
            <tem:Username>usertest</tem:Username>
            <!--Optional:-->
            <tem:Password>passtest</tem:Password>
            <!--Optional:-->
            <tem:Data>
               <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
               <xsl:apply-templates select="/p:ReservationRequest/p:DATA"></xsl:apply-templates>
               <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
            </tem:Data>
         </tem:SendReservation>
      </xsl:template>
      <xsl:template match="*">
         <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|node()"></xsl:apply-templates>
         </xsl:element>
      </xsl:template>
      <xsl:template match="@*">
         <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."></xsl:value-of>
         </xsl:attribute>
      </xsl:template>
   </xsl:stylesheet>

1111
用户测试
通过测试
![CDATA[
]]
答复:

  <tem:SendReservation xmlns:tem="http://tempuri.org/">
     <!--Optional:-->
     <tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
     <!--Optional:-->
     <tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
     <!--Optional:-->
     <tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
     <!--Optional:-->
     <tem:Data><![CDATA[<DATA> <Reservation>

     <tktReservationGUID>54321</tktReservationGUID>
     <tktState>CA</tktState>
     <LocationId>1357</LocationId>
  </Reservation> </DATA>]]></tem:Data>
  </tem:SendReservation>
<tem:SendReservation xmlns:tem="http://tempuri.org/">
   <tem:ProviderGuid>1111</tem:ProviderGuid>
   <tem:Username>usertest</tem:Username>
   <tem:Password>passtest</tem:Password>
   <tem:Data><![CDATA[<DATA>
      <Reservation>
         <tktReservationGUID>13579</tktReservationGUID>
         <tktState>CA</tktState>
         <LocationId>1357</LocationId>
      </Reservation>
</DATA>]]></tem:Data>
</tem:SendReservation>

1111
用户测试
通过测试
13579
加利福尼亚州
1357
]]>

我能够稍微更改输入请求,使其与我的响应非常相似。我在下面发布了我的新请求以及用于转换它的XSLT

新要求:

<p:ReservationRequest xmlns:p="http://sample.request.com/">
  <p:DATA>
      <!--Exactly 1 occurrence-->
      <p:Reservation>
         <p:tktReservationGUID>13579</p:tktReservationGUID>
         <p:tktState>CA</p:tktState>
         <p:LocationId>1357</p:LocationId>
      </p:Reservation>
  </p:DATA>
</p:ReservationRequest>

13579
加利福尼亚州
1357
新XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tem="http://tempuri.org/" xmlns:p="http://sample.request.com/" exclude-result-prefixes="p tem" version="1.0">
      <xsl:output indent="yes" cdata-section-elements="tem:Data"/>
      <xsl:template match="/">
         <tem:SendReservation>
            <!--Optional:-->
            <tem:ProviderGuid>1111</tem:ProviderGuid>
            <!--Optional:-->
            <tem:Username>usertest</tem:Username>
            <!--Optional:-->
            <tem:Password>passtest</tem:Password>
            <!--Optional:-->
            <tem:Data>
               <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
               <xsl:apply-templates select="/p:ReservationRequest/p:DATA"></xsl:apply-templates>
               <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
            </tem:Data>
         </tem:SendReservation>
      </xsl:template>
      <xsl:template match="*">
         <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|node()"></xsl:apply-templates>
         </xsl:element>
      </xsl:template>
      <xsl:template match="@*">
         <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."></xsl:value-of>
         </xsl:attribute>
      </xsl:template>
   </xsl:stylesheet>

1111
用户测试
通过测试
![CDATA[
]]
答复:

  <tem:SendReservation xmlns:tem="http://tempuri.org/">
     <!--Optional:-->
     <tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
     <!--Optional:-->
     <tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
     <!--Optional:-->
     <tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
     <!--Optional:-->
     <tem:Data><![CDATA[<DATA> <Reservation>

     <tktReservationGUID>54321</tktReservationGUID>
     <tktState>CA</tktState>
     <LocationId>1357</LocationId>
  </Reservation> </DATA>]]></tem:Data>
  </tem:SendReservation>
<tem:SendReservation xmlns:tem="http://tempuri.org/">
   <tem:ProviderGuid>1111</tem:ProviderGuid>
   <tem:Username>usertest</tem:Username>
   <tem:Password>passtest</tem:Password>
   <tem:Data><![CDATA[<DATA>
      <Reservation>
         <tktReservationGUID>13579</tktReservationGUID>
         <tktState>CA</tktState>
         <LocationId>1357</LocationId>
      </Reservation>
</DATA>]]></tem:Data>
</tem:SendReservation>

1111
用户测试
通过测试
13579
加利福尼亚州
1357
]]>


能否将XSLT 3.0与Saxon 9.6结合使用?或者您针对哪个XSLT处理器使用哪个XSLT版本?能否将XSLT 3.0与Saxon 9.6结合使用?或者您针对哪个XSLT处理器使用哪个XSLT版本?能否将XSLT 3.0与Saxon 9.6结合使用?或者您针对哪个XSLT处理器使用哪个XSLT版本?能否将XSLT 3.0与Saxon 9.6结合使用?或者您针对哪个XSLT版本和哪个XSLT处理器?Martin,谢谢您的解决方案。但是,我们的XSLT引擎不支持此选项。我们仍然使用XSL1.0作为引擎的一部分。是否有任何解决方案可以使用xsl 1.0完成?请检查XSLT 1.0处理器是否提供或允许您实现扩展函数来序列化树,或集成纯XSLT 1.0解决方案,如代码中所示。@Rudraksh,我已经添加了一个XSLT1.0示例,它使用了我在前面的评论中链接到的库模块
xml-to-string
。我也尝试了这个选项。但是,我的编辑器没有使用该模块。我仍在努力使这一点起作用。我真的很感激你能更快地恢复过来。如果你的编辑器没有通过HTTP加载样式表模块,你可以下载样式表模块并在本地使用。Martin,谢谢你的解决方案。但是,我们的XSLT引擎不支持此选项。我们仍然使用XSL1.0作为引擎的一部分。是否有任何解决方案可以使用xsl 1.0完成?请检查XSLT 1.0处理器是否提供或允许您实现exte