xstl 转换在结果元素中插入名称空间(重新访问)

xstl transform inserts namespace in result elements (revisited)

我有一个 xml 文件,我需要在其中重命名元素。 (后来也将元素转换为属性)。 xslt 转换将默认名称空间插入到所有顶级元素中。我不想要那个。我已经看到很多关于这个问题的问题,但仍然对预期的结果有疑问并理解为什么...

  1. 我对 exclude-result-prefixes 能做的最好的事情是:
<ar xmlns="">
<dyu xmlns="http://www.coastsystems.net">ábada</dyu>

为什么命名空间只从 ar 中删除?为什么它保留 xmlns=""?

  1. 如果我删除 转换的重命名部分,那么它基本上只是复制原始文件:
      <xsl:template match="/c:lexique/c:headword">                                                                                                     
      <ar>                                                                                                                                           
        <xsl:apply-templates select="@* | node()"/>                                                                                                  
      </ar>                                                                                                                                          
      </xsl:template>  

然后'exclude-result-prefixes'好像一点效果都没有。无论是否存在,都没有插入命名空间。为什么?

xslt3 有问题吗?我需要使用它,因为它可以处理拉丁扩展字符并正确排序。

xml如下:

    <?xml version='1.0' encoding='utf-8'?>                                                                                                             
<lexique xmlns="http://www.coastsystems.net"                                                                                                       
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                                                                                     
         xsi:schemaLocation="http://www.coastsystems.net headwords2.xsd"                                                                           
>                                                                                                                                                  
  <headword>                                                                                                                                       
    <dyu>ábada</dyu>                                                                                                                               
    <alt>abada</alt>                                                                                                                               
    <emp></emp>                                                                                                                                    
    <cf>fewu</cf>                                                                                                                                  
    <trans>                                                                                                                                        
      <lang>fr</lang>                                                                                                                              
      <detail></detail>                                                                                                                            
      <speech>                                                                                                                                     
        <type></type>                                                                                                                              
        <t-uuid>7b8612bc-23c7-4241-817f-f6fcd9bff8ac</t-uuid>                                                                                      
        <def>                                                                                                                                      
          <gloss>jamais</gloss>                                                                                                                    
          <gl-id>bbc05aae-8f08-4ab7-91ae-3b52533a896f</gl-id>                                                                                      
          <note2></note2>                                                                                                                          
          <note3></note3>                                                                                                                          
          <note4></note4>                                                                                                                          
          <tags></tags>                                                                                                                            
          <example>                                                                                                                                
            <source>a tɛ koɲuman kɛ abada.</source>                                                                                                
            <target>Il ne fait jamais quelque chose de bien.</target>                                                                              
            <ex-id>2c592b68-0d29-4b6c-8614-005adab4fba5</ex-id>                                                                                    
          </example>                                                                                                                               
        </def>                                                                                                                                     
      </speech>                                                                                                                                    
    </trans>                                                                                                                                       
  </headword>                                                                                                                                      
</lexique>               

使用 xslt 样式表:

<?xml version="1.0"?>                                                                                                                              
<xsl:stylesheet version="2.0"                                                                                                                      
  xmlns:xsl  = "http://www.w3.org/1999/XSL/Transform"                                                                                              
  xmlns:c="http://www.coastsystems.net"                                                                                                            
  exclude-result-prefixes="xsl c"                                                                                                                  
>                                                                                                                                                  
 <xsl:output method="xml" indent="yes" encoding="UTF-8" />                                                                                         
                                                                                                                                                   
                                                                                                                                                   
 <xsl:template match="/">                                                                                                                          
    <xsl:apply-templates select="@*|node()"/>                                                                                                      
  </xsl:template>                                                                                                                                  
                                                                                                                                                   
  <xsl:template match="@*|node()">                                                                                                                 
    <xsl:copy>                                                                                                                                     
      <xsl:apply-templates select="@*|node()"/>                                                                                                    
    </xsl:copy>                                                                                                                                    
  </xsl:template>                                                                                                                                  
                                                                                                                                                   
  <xsl:template match="/c:lexique/c:headword">                                                                                                     
    <ar>                                                                                                                                           
      <xsl:apply-templates select="@* | node()"/>                                                                                                  
    </ar>                                                                                                                                          
  </xsl:template>                                                                                                                                  
                                                                                                                                                   
</xsl:stylesheet>           

(xslt3 -xsl:rename.xsl -s:headwords.xml) 输出:

<?xml version="1.0" encoding="UTF-8"?>
<lexique xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.coastsystems.net" xsi:schemaLocation="http://www.coastsystems.net headwords2.xsd">
   <ar xmlns="">
      <dyu xmlns="http://www.coastsystems.net">ábada</dyu>
      <alt xmlns="http://www.coastsystems.net">abada</alt>
      <emp xmlns="http://www.coastsystems.net"/>
      <cf xmlns="http://www.coastsystems.net">fewu</cf>
      <trans xmlns="http://www.coastsystems.net">
         <lang>fr</lang>
         <detail/>
         <speech>
            <type/>
            <t-uuid>7b8612bc-23c7-4241-817f-f6fcd9bff8ac</t-uuid>
            <def>
               <gloss>jamais</gloss>
               <gl-id>bbc05aae-8f08-4ab7-91ae-3b52533a896f</gl-id>
               <note2/>
               <note3/>
               <note4/>
               <tags/>
               <example>
                  <source>a tɛ koɲuman kɛ abada.</source>
                  <target>Il ne fait jamais quelque chose de bien.</target>
                  <ex-id>2c592b68-0d29-4b6c-8614-005adab4fba5</ex-id>
               </example>
            </def>
         </speech>
      </trans>
   </ar>

期望的输出:

<?xml version="1.0" encoding="UTF-8"?>
<lexique xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.coastsystems.net" xsi:schemaLocation="http://www.coastsystems.net headwords2.xsd">
   <ar>
      <dyu>ábada</dyu>
      <alt>abada</alt>
      <emp/>
      <cf>fewu</cf>
      <trans>
         <lang>fr</lang>
         <detail/>
=====  snipped

exclude-result-prefixes 的指令仅在不使用时排除它们。如果您希望在没有名称空间的情况下生成其他元素,则需要创建没有名称空间的元素(使用 local-name()),而不是使用 xsl:copy.

您可以通过为任何元素添加一个通用模板来实现这一点(遵循匹配 @*|node() 的身份模板,以便它具有更高的优先级匹配。

如果您希望所有元素都绑定到 `` 命名空间,但不使用前缀,则在样式表中设置默认命名空间 xmlns="http://www.coastsystems.net":

<xsl:stylesheet version="2.0"                                                                                                                      
    xmlns:xsl  = "http://www.w3.org/1999/XSL/Transform"     
    xmlns="http://www.coastsystems.net"    
    xmlns:c="http://www.coastsystems.net"                                                                                                            
    exclude-result-prefixes="xsl c"                                                                                                                  
    >                                                                                                                                                  
    <xsl:output method="xml" indent="yes" encoding="UTF-8" />                                                                                         

    <xsl:template match="@*|node()">                                                                                                                 
        <xsl:copy>                                                                                                                                     
            <xsl:apply-templates select="@*|node()"/>                                                                                                    
        </xsl:copy>                                                                                                                                    
    </xsl:template>  
    
    <xsl:template match="*">                                                                                                                 
        <xsl:element name="{local-name()}">                                                                                                                                     
            <xsl:apply-templates select="@*|node()"/>                                                                                                    
        </xsl:element>                                                                                                                                    
    </xsl:template> 
    
    <xsl:template match="/c:lexique/c:headword">                                                                                                     
        <ar>                                                                                                                                           
            <xsl:apply-templates select="@* | node()"/>                                                                                                  
        </ar>                                                                                                                                          
    </xsl:template>                                                                                                                                  
    
</xsl:stylesheet> 

您还可以更改身份模板的匹配表达式以列出特定的 node() 而不是包括 *@*|text()|comment()|processing-instruction().