首页 文章

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

提问于
浏览
0

我的要求是转换下面的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文件:( The required output:

<?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 (implementaing suggestion @Stefan Hegny suggestion: 问题: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>

New output using above 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 回答

  • 1

    <xsl:attribute name="xmlns:sii"> 正在添加xmlns命名空间,你真的打算这个吗?

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

    sii命名空间由您创建的元素(如 <xsl:element name="sii:Cabecera"> )使用,这就是它出现的原因 . 如果您不希望它创建没有名称空间的元素

    <xsl:element name="Cabecera">

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

    Edit 2 表示您显示的所需输出

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

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

    我还简化了几个可以简单地编写为元素的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">
    
        <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>
    
  • 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”>

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

相关问题