使用XSLT在xml输出文件中添加“xmlns:xmlns”,并且exclude-result-prefixes =“sii”不会从元素中排除命名空间

时间:2017-03-27 14:38:57

标签: xslt namespaces

我的要求是转换到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

Modiifed 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

2 个答案:

答案 0 :(得分:1)

{% if model.datefinish == datetime.today %} <h5>It ends today</h5> {% else %} <h5>It does not end today</h5> {% endif %} 正在添加xmlns命名空间,你真的打算这个??

编辑:这不是必需的,因为在顶部声明的所有名称空间前缀都会在任何地方继承。省略所有这些属性<xsl:attribute name="xmlns:sii">xmlns:sii等。

sii命名空间由您创建的元素xmlns:siiLR使用,这就是它出现的原因。如果您不希望它创建没有名称空间的元素,如

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

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

编辑2 以显示所需的输出

为什么要排除sii名称空间?它用在你的输出中,因此必须在那里......

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

我还简化了几个可以简单编写为元素的xsl:元素。

<xsl:element name="Cabecera">

答案 1 :(得分:0)

为什么要使用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.xsd SuministroLR.xsd”&gt;

我认为这应该可以解决这个问题。让我知道。