我的要求是转换下面的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中
2 回答
<xsl:attribute name="xmlns:sii">
正在添加xmlns命名空间,你真的打算这个吗?Edit: 这不是必需的,因为在顶部声明的所有名称空间前缀都是在任何地方继承的 . 省略所有这些属性
xmlns:sii
,xmlns:siiLR
等 .sii命名空间由您创建的元素(如
<xsl:element name="sii:Cabecera">
)使用,这就是它出现的原因 . 如果您不希望它创建没有名称空间的元素<xsl:element name="Cabecera">
并且不要将任何sii:namespace-prefixed元素复制到输出中 .
Edit 2 表示您显示的所需输出
为什么要排除sii名称空间?它用在你的输出中,因此必须在那里......
我认为架构位置应该包含命名空间URL和架构URL,不知道是否应该将其折叠成一个相同的 .
我还简化了几个可以简单地编写为元素的xsl:元素 .
为什么要使用siiLR:SuministroLRPagosRecibidas作为xsl:element ???而不是使用:
....
请尝试以下方法:
xsi:schemaLocation =“https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd SuministroLR.xsd”>
我认为这应该可以解决这个问题 . 让我知道 .