【问题标题】:"xmlns:xmlns" is getting added in xml output file using XSLT and exclude-result-prefixes="sii" is not excluding the namespace from elements使用 XSLT 将“xmlns:xmlns”添加到 xml 输出文件中,并且 exclude-result-prefixes="sii" 不从元素中排除命名空间
【发布时间】:2017-03-27 14:38:56
【问题描述】:

我的要求是转换下面的xml文件:

     <?xml version="1.0" encoding="UTF-8"?>
 <JEES_SSI>
  <P_VAT_ID>10122</P_VAT_ID>
  <LIST_G_LE_DETAILS>
   <G_LE_DETAILS>
    <ENTITYNAME>LE NAME</ENTITYNAME>
    <TAXPAYEID>A0000000A</TAXPAYEID>
   </G_LE_DETAILS>
  </LIST_G_LE_DETAILS>
 </JEES_SSI>

到新的xml文件:(所需的输出:

 <?xml version="1.0" encoding="UTF-8"?>
  <siiLR:SuministroLRFacturasRecibidas 
   xmlns:siiLR="https:/www.firstschema/SLR.xsd"
   xmlns:sii="https://www.secondschema/sinfo.xsd"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="https://www.firstschema/ SLR.xsd">
   <sii:Cabecera>
      <sii:Titular>
        <sii:NombreRazon>LE NAME</sii:NombreRazon>
        <sii:NIF>A0000000A</sii:NIF>
     </sii:Titular>
  </sii:Cabecera>
 </siiLR:SuministroLRFacturasRecibidas>

我正在使用以下 XSL:

    <?xml version="1.0" encoding="UTF-8" ?> 
    <xsl:stylesheet version="1.0"  
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:siiLR="https:/www.firstschema/SLR.xsd"
     xmlns:sii="https://www.secondschema/sinfo.xsd"
     exclude-result-prefixes="sii">

    <xsl:output method="xml" indent="yes" />

     <xsl:template match="/">
     <xsl:element name="siiLR:SuministroLRFacturasRecibidas">
         <xsl:attribute name="xmlns:siiLR"> <xsl:value-of select= "'https:/www.firstschema/SLR.xsd'" /></xsl:attribute>
     <xsl:attribute name="xmlns:sii"> <xsl:value-of select= "'https://www.secondschema/sinfo.xsd'"/></xsl:attribute>
     <xsl:attribute name="xsi:schemaLocation"> <xsl:value-of select= "'https://www.secondschema/ sinfo.xsd'" /> </xsl:attribute>


    <xsl:element name="sii:Cabecera">

                <xsl:element name="sii:Titular"> 
                    <xsl:element name="sii:NombreRazon"> <xsl:value-of select= "JEES_SSI/LIST_G_LE_DETAILS/G_LE_DETAILS/ENTITYNAME" /> </xsl:element>
                    <xsl:element name="sii:NIF"> <xsl:value-of select= "JEES_SSI/LIST_G_LE_DETAILS/G_LE_DETAILS/TAXPAYERID" /> </xsl:element>
                </xsl:element>
              </xsl:element>     
</xsl:element> 

我得到的输出:

输出有额外的字符串 xmlns:xmlns="http://www.w3.org/2000/xmlns/" 导致错误: XML 解析错误:保留前缀 (xmlns) 不得声明或未声明 并且命名空间正在为 sii 命名空间的第一个元素添加。

    <?xml version = '1.0' encoding = 'UTF-8'?>
        <siiLR:SuministroLRFacturasRecibidas xmlns:siiLR="https:/www.firstschema/SLR.xsd" 
          xmlns:xmlns="http://www.w3.org/2000/xmlns/" 
          xmlns:sii="https://www.secondschema/sinfo.xsd" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="https://www.firstschema/ SLR.xsd">
           <sii:Cabecera xmlns:sii="https://www.secondschema/sinfo.xsd">
              <sii:Titular>
                 <sii:NombreRazon>LE NAME</sii:NombreRazon>
                 <sii:NIF>A0000000A</sii:NIF>
              </sii:Titular>
           </sii:Cabecera>
        </siiLR:SuministroLRFacturasRecibidas>

请帮助更正 xsl 文件以获得所需的 xml 输出文件。 xml 文件中的元素有两个不同的命名空间前缀(siiLr 和 sii)。 exclude-result-prefixes="sii" 不排除 sii:Cabecera 中的命名空间 URI

修改后的 XLS(实施建议 @Stefan Hegny 建议: 问题:xmlns:xmlns="http://www.w3.org/2000/xmlns/" 不再出现,如果 我使用下面的 XSL。(从根元素中删除 xmlns:siiLR 和 xmlns:sii 属性)

    <?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="1.0"  
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:siiLR="https:/www.firstschema/SLR.xsd"
 xmlns:sii="https://www.secondschema/sinfo.xsd"
 >

<xsl:output method="xml" indent="yes" />

 <xsl:template match="/">
 <xsl:element name="siiLR:SuministroLRFacturasRecibidas">
  <xsl:attribute name="xsi:schemaLocation"> <xsl:value-of select= "'https://www.secondschema/ sinfo.xsd'" /> </xsl:attribute>
        <xsl:element name="sii:Cabecera">
            <xsl:element name="sii:Titular"> 
                <xsl:element name="sii:NombreRazon"> <xsl:value-of select= "JEES_SSI/LIST_G_LE_DETAILS/G_LE_DETAILS/ENTITYNAME" /> </xsl:element>
                <xsl:element name="sii:NIF"> <xsl:value-of select= "JEES_SSI/LIST_G_LE_DETAILS/G_LE_DETAILS/TAXPAYERID" /> </xsl:element>
            </xsl:element>
          </xsl:element>     
</xsl:element> 
</xsl:template>
</xsl:stylesheet>

使用上述 XLS 的新输出:

        <?xml version = '1.0' encoding = 'UTF-8'?>
    <siiLR:SuministroLRFacturasRecibidas     xmlns:siiLR="https:/www.firstschema/SLR.xsd" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="https://www.firstschema/ SLR.xsd">
       <sii:Cabecera xmlns:sii="https://www.secondschema/sinfo.xsd">
          <sii:Titular>
             <sii:NombreRazon>LE NAME</sii:NombreRazon>
             <sii:NIF>A0000000A</sii:NIF>
          </sii:Titular>
       </sii:Cabecera>
    </siiLR:SuministroLRFacturasRecibidas>

命名空间 sii 链接出现在元素“Cabecera”中。它应该出现在根元素 SuministroLRFacturasRecibidas

Output with multiple sii element

【问题讨论】:

    标签: xslt namespaces


    【解决方案1】:

    &lt;xsl:attribute name="xmlns:sii"&gt; 正在添加 xmlns 命名空间,你真的打算这样做吗??

    编辑:这不是必需的,因为在顶部声明的所有命名空间前缀都可以在任何地方继承。省略所有这些属性xmlns:siixmlns:siiLR 等。

    sii 命名空间被您创建的元素使用,例如&lt;xsl:element name="sii:Cabecera"&gt;,这就是它出现的原因。如果您不希望它创建没有命名空间的元素,例如

    &lt;xsl:element name="Cabecera"&gt;

    并且不要将任何 sii: namespace-prefixed 元素复制到您的输出中。

    编辑 2 以获得所需的输出

    为什么要排除 sii 命名空间?它在您的输出中使用,因此必须在其中...

    我认为架构位置应该包含命名空间 URL 和架构 URL,如果相同,不知道是否应该将其折叠成一个。

    我还简化了你的几个 xsl:elements,它们可以简单地写成元素。

        <?xml version="1.0" encoding="UTF-8" ?> 
        <xsl:stylesheet version="1.0"  
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:siiLR="https:/www.firstschema/SLR.xsd"
         xmlns:sii="https://www.secondschema/sinfo.xsd">
    
        <xsl:output method="xml" indent="yes" />
    
         <xsl:template match="/">
         <xsl:element name="siiLR:SuministroLRFacturasRecibidas">
         <xsl:attribute name="xsi:schemaLocation"><xsl:text>https://www.secondschema/sinfo.xsd https://www.secondschema/sinfo.xsd</xsl:text></xsl:attribute>
    
    
        <sii:Cabecera>
                    <sii:Titular> 
                        <sii:NombreRazon> <xsl:value-of select= "JEES_SSI/LIST_G_LE_DETAILS/G_LE_DETAILS/ENTITYNAME" /> </sii:NombreRazon>
                        <sii:NIF> <xsl:value-of select= "JEES_SSI/LIST_G_LE_DETAILS/G_LE_DETAILS/TAXPAYERID" /> </sii:NIF>
                    </sii:Titular>
                  </sii:Cabecera>     
    </xsl:element> 
    

    【讨论】:

    • 最终的 XML 文件需要使用 XSD 进行验证。并且,第二个模式 sinfo.xsd 在第一个 SLR.xsd 中被引用。因此,没有前缀 (sii) 的 xml 文件将不会被验证。
    • 所以 sii 命名空间前缀不是问题,但为什么name="xmlns:sii"?啊,我明白了,您正在尝试手动实现架构引用...好吧,sii 和 siiLR 命名空间前缀是从顶部的声明中继承的,无需在 &lt;xsl:element name="siiLR:SuministroLRFacturasRecibidas"&gt; 下再次指定。
    • 谢谢斯特凡。如果我从根元素 SuministroLRFacturasRecibidas 中删除用于 sii 和 siiLR 的属性,则输出没有 sii 命名空间的信息。唯一的好处是,现在 xmlns:xmlns="w3.org/2000/xmlns" 没有出现在输出中。但在子元素 w3.org/2001/XMLSchema-instance" xsi:schemaLocation="firstschemaSLR.xsd"> secondschema/sinfo.xsd">
    • 我建议您准确发布输出应该是什么样子(请编辑问题)。在 cmets 中,所有这些似乎都没有多大意义。
    • 我用新的 xsl 和相应的输出更新了问题。也标记了所需的输出。
    【解决方案2】:

    为什么要使用 siiLR:SuministroLRPagosRecibidas 作为 xsl:element ??? 而不是使用:

     <xsl:element name="siiLR:SuministroLRFacturasRecibidas">
    
     <xsl:attribute name="xsi:schemaLocation"><xsl:text>https://www.secondschema/sinfo.xsd https://www.secondschema/sinfo.xsd</xsl:text></xsl:attribute>
    

    ....

    尝试以下方法:

    xsi:schemaLocation="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsdSuministroLR.xsd" >

    我认为这应该可以解决问题。告诉我。

    【讨论】:

      猜你喜欢
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多