XSLT 基础 - 不正确的转换
XSLT basic - Incorrect transformation
我刚开始使用 XSLT,无法继续创建非常简单的 XSL
这是我的问题:
我有一个基本的 xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<InvokeLIREVOIE xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2015-01-05T18:12:58+01:00" transLanguage="FR" baseLanguage="FR" messageID="1420477955208836965" maximoVersion="7 5 20140411-2000 V7511--1">
<LIREVOIESet>
<VOIE>
<CODE_CATEGORIE></CODE_CATEGORIE>
<CODE_COMMUNE>203</CODE_COMMUNE>
<CODE_COMMUNE_ASSAIN></CODE_COMMUNE_ASSAIN>
<CODE_COMMUNE_ASSAIN_INSEE></CODE_COMMUNE_ASSAIN_INSEE>
<CODE_LIVRE></CODE_LIVRE>
<CODE_VOIE>2985</CODE_VOIE>
<COORDX></COORDX>
<COORDY></COORDY>
... (more useless elements)
</VOIE>
</LIREVOIESet>
</InvokeLIREVOIE>
</soapenv:Body>
</soapenv:Envelope>
转换后的输出必须是:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:v01="http://host/WebServiceXXX"
xmlns:v011="http://host/WebServiceXXX">
<soapenv:Header>
<v01:enveloppeTechnique>
<v01:horodateAppel>?</v01:horodateAppel>
<!--Optional:-->
<v01:idOperation>?</v01:idOperation>
<v01:idTransaction>?</v01:idTransaction>
<v01:idConsommateur>SIV2</v01:idConsommateur>
<!--Optional:-->
<v01:idUtilisateur>?</v01:idUtilisateur>
<!--Optional:-->
<v01:canal>?</v01:canal>
<!--Optional:-->
<v01:langue>?</v01:langue>
<!--Optional:-->
<v01:pays>?</v01:pays>
</v01:enveloppeTechnique>
</soapenv:Header>
<soapenv:Body>
<v011:lireVoie>
<v011:CODE_COMMUNE>609</v011:CODE_COMMUNE>
<v011:CODE_VOIE>7440</v011:CODE_VOIE>
</v011:lireVoie>
</soapenv:Body>
</soapenv:Envelope>
基本上我只需要将 CODE_COMMUNE 和 CODE_VOIE 值从我的主 xml 文件复制到我的输出。
其他字段可以是静态的
我为此创建了一个非常基本的 XSL,但输出很奇怪,我找不到问题所在:
<?xml version="1.0" encoding="utf-8"?>
203
2985
我的 XSL 文件:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v01="http://host/WebServiceXXX" xmlns:v011="http://host/WebServiceXXX">
<soapenv:Header>
<v01:enveloppeTechnique>
<v01:horodateAppel></v01:horodateAppel>
<!--Optional:-->
<v01:idOperation></v01:idOperation>
<v01:idTransaction></v01:idTransaction>
<v01:idConsommateur>SIV2</v01:idConsommateur>
<!--Optional:-->
<v01:idUtilisateur></v01:idUtilisateur>
<!--Optional:-->
<v01:canal></v01:canal>
<!--Optional:-->
<v01:langue></v01:langue>
<!--Optional:-->
<v01:pays></v01:pays>
</v01:enveloppeTechnique>
</soapenv:Header>
<soapenv:Body>
<v011:lireVoie>
<xsl:template match="VOIE">
<v011:CODE_COMMUNE>
<xsl:value-of select="CODE_COMMUNE"/>
</v011:CODE_COMMUNE>
<v011:CODE_VOIE>
<xsl:value-of select="CODE_VOIE" />
</v011:CODE_VOIE>
</xsl:template>
</v011:lireVoie>
</soapenv:Body>
</soapenv:Envelope>
</xsl:stylesheet>
感谢您的帮助!
您有几个问题:
您必须将说明放在模板中才能编写
到输出树。
您的源 XML 元素在名称空间中;你必须声明一个
每个名称空间的前缀,并在寻址中的节点时使用它
源文件.
您必须使用<comment>
指令才能发表评论
在输出中。
这样试试:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:max="http://www.ibm.com/maximo"
exclude-result-prefixes="max">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<soapenv:Envelope xmlns:v01="http://host/WebServiceXXX" xmlns:v011="http://host/WebServiceXXX">
<soapenv:Header>
<v01:enveloppeTechnique>
<v01:horodateAppel></v01:horodateAppel>
<xsl:comment>Optional:</xsl:comment>
<v01:idOperation></v01:idOperation>
<v01:idTransaction></v01:idTransaction>
<v01:idConsommateur>SIV2</v01:idConsommateur>
<xsl:comment>Optional:</xsl:comment>
<v01:idUtilisateur></v01:idUtilisateur>
<xsl:comment>Optional:</xsl:comment>
<v01:canal></v01:canal>
<xsl:comment>Optional:</xsl:comment>
<v01:langue></v01:langue>
<xsl:comment>Optional:</xsl:comment>
<v01:pays></v01:pays>
</v01:enveloppeTechnique>
</soapenv:Header>
<soapenv:Body>
<v011:lireVoie>
<v011:CODE_COMMUNE>
<xsl:value-of select="soapenv:Envelope/soapenv:Body/max:InvokeLIREVOIE/max:LIREVOIESet/max:VOIE/max:CODE_COMMUNE"/>
</v011:CODE_COMMUNE>
<v011:CODE_VOIE>
<xsl:value-of select="soapenv:Envelope/soapenv:Body/max:InvokeLIREVOIE/max:LIREVOIESet/max:VOIE/max:CODE_VOIE" />
</v011:CODE_VOIE>
</v011:lireVoie>
</soapenv:Body>
</soapenv:Envelope>
</xsl:template>
</xsl:stylesheet>
我刚开始使用 XSLT,无法继续创建非常简单的 XSL 这是我的问题: 我有一个基本的 xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<InvokeLIREVOIE xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2015-01-05T18:12:58+01:00" transLanguage="FR" baseLanguage="FR" messageID="1420477955208836965" maximoVersion="7 5 20140411-2000 V7511--1">
<LIREVOIESet>
<VOIE>
<CODE_CATEGORIE></CODE_CATEGORIE>
<CODE_COMMUNE>203</CODE_COMMUNE>
<CODE_COMMUNE_ASSAIN></CODE_COMMUNE_ASSAIN>
<CODE_COMMUNE_ASSAIN_INSEE></CODE_COMMUNE_ASSAIN_INSEE>
<CODE_LIVRE></CODE_LIVRE>
<CODE_VOIE>2985</CODE_VOIE>
<COORDX></COORDX>
<COORDY></COORDY>
... (more useless elements)
</VOIE>
</LIREVOIESet>
</InvokeLIREVOIE>
</soapenv:Body>
</soapenv:Envelope>
转换后的输出必须是:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:v01="http://host/WebServiceXXX"
xmlns:v011="http://host/WebServiceXXX">
<soapenv:Header>
<v01:enveloppeTechnique>
<v01:horodateAppel>?</v01:horodateAppel>
<!--Optional:-->
<v01:idOperation>?</v01:idOperation>
<v01:idTransaction>?</v01:idTransaction>
<v01:idConsommateur>SIV2</v01:idConsommateur>
<!--Optional:-->
<v01:idUtilisateur>?</v01:idUtilisateur>
<!--Optional:-->
<v01:canal>?</v01:canal>
<!--Optional:-->
<v01:langue>?</v01:langue>
<!--Optional:-->
<v01:pays>?</v01:pays>
</v01:enveloppeTechnique>
</soapenv:Header>
<soapenv:Body>
<v011:lireVoie>
<v011:CODE_COMMUNE>609</v011:CODE_COMMUNE>
<v011:CODE_VOIE>7440</v011:CODE_VOIE>
</v011:lireVoie>
</soapenv:Body>
</soapenv:Envelope>
基本上我只需要将 CODE_COMMUNE 和 CODE_VOIE 值从我的主 xml 文件复制到我的输出。 其他字段可以是静态的
我为此创建了一个非常基本的 XSL,但输出很奇怪,我找不到问题所在:
<?xml version="1.0" encoding="utf-8"?>
203
2985
我的 XSL 文件:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v01="http://host/WebServiceXXX" xmlns:v011="http://host/WebServiceXXX">
<soapenv:Header>
<v01:enveloppeTechnique>
<v01:horodateAppel></v01:horodateAppel>
<!--Optional:-->
<v01:idOperation></v01:idOperation>
<v01:idTransaction></v01:idTransaction>
<v01:idConsommateur>SIV2</v01:idConsommateur>
<!--Optional:-->
<v01:idUtilisateur></v01:idUtilisateur>
<!--Optional:-->
<v01:canal></v01:canal>
<!--Optional:-->
<v01:langue></v01:langue>
<!--Optional:-->
<v01:pays></v01:pays>
</v01:enveloppeTechnique>
</soapenv:Header>
<soapenv:Body>
<v011:lireVoie>
<xsl:template match="VOIE">
<v011:CODE_COMMUNE>
<xsl:value-of select="CODE_COMMUNE"/>
</v011:CODE_COMMUNE>
<v011:CODE_VOIE>
<xsl:value-of select="CODE_VOIE" />
</v011:CODE_VOIE>
</xsl:template>
</v011:lireVoie>
</soapenv:Body>
</soapenv:Envelope>
</xsl:stylesheet>
感谢您的帮助!
您有几个问题:
您必须将说明放在模板中才能编写 到输出树。
您的源 XML 元素在名称空间中;你必须声明一个 每个名称空间的前缀,并在寻址中的节点时使用它 源文件.
您必须使用
<comment>
指令才能发表评论 在输出中。
这样试试:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:max="http://www.ibm.com/maximo"
exclude-result-prefixes="max">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<soapenv:Envelope xmlns:v01="http://host/WebServiceXXX" xmlns:v011="http://host/WebServiceXXX">
<soapenv:Header>
<v01:enveloppeTechnique>
<v01:horodateAppel></v01:horodateAppel>
<xsl:comment>Optional:</xsl:comment>
<v01:idOperation></v01:idOperation>
<v01:idTransaction></v01:idTransaction>
<v01:idConsommateur>SIV2</v01:idConsommateur>
<xsl:comment>Optional:</xsl:comment>
<v01:idUtilisateur></v01:idUtilisateur>
<xsl:comment>Optional:</xsl:comment>
<v01:canal></v01:canal>
<xsl:comment>Optional:</xsl:comment>
<v01:langue></v01:langue>
<xsl:comment>Optional:</xsl:comment>
<v01:pays></v01:pays>
</v01:enveloppeTechnique>
</soapenv:Header>
<soapenv:Body>
<v011:lireVoie>
<v011:CODE_COMMUNE>
<xsl:value-of select="soapenv:Envelope/soapenv:Body/max:InvokeLIREVOIE/max:LIREVOIESet/max:VOIE/max:CODE_COMMUNE"/>
</v011:CODE_COMMUNE>
<v011:CODE_VOIE>
<xsl:value-of select="soapenv:Envelope/soapenv:Body/max:InvokeLIREVOIE/max:LIREVOIESet/max:VOIE/max:CODE_VOIE" />
</v011:CODE_VOIE>
</v011:lireVoie>
</soapenv:Body>
</soapenv:Envelope>
</xsl:template>
</xsl:stylesheet>