我正在编写一个xslt来转换下面的xml。当我对xml执行xslt时,输出会删除<soapenv:Envelope>
元素上的第二个属性。
应该如下所示:<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.visionwebqa.com" >
但是我得到:<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >
我认为我应该只是能够在代码中包含soapenv:Envelope元素的属性,并有它的输出类型,但它不工作。如果你能帮我找出我做错了什么,我会很感激的。
谢谢!
这是我正在工作的xml:
<?xml version="1.0" encoding="UTF-8" ?>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
<ERRORCODE>0</ERRORCODE>
<PRODUCT BUILD="09-05-2019" NAME="FileMaker" VERSION="ProAdvanced 18.0.3"/>
<DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="" NAME="Code.fmp12" RECORDS="1" TIMEFORMAT="h:mm:ss a"/>
<METADATA>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Company" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="EdiUserid" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Param1" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Param2" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Param3" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Password" TYPE="TEXT"/>
</METADATA>
<RESULTSET FOUND="1">
<ROW MODID="0" RECORDID="1">
<COL><DATA>VisionLab</DATA></COL>
<COL><DATA>OurQA</DATA></COL>
<COL><DATA></DATA></COL>
<COL><DATA>ROOur</DATA></COL>
<COL><DATA>0199</DATA></COL>
<COL><DATA>vision</DATA></COL>
</ROW>
</RESULTSET>
</FMPXMLRESULT>
这里是我一直在使用的xslt:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ser="http://services.visionwebqa.com"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:fm="http://www.filemaker.com/fmpxmlresult" exclude-result-prefixes="ser soapenv fm">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/|node()">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="fm:ROW">
<xsl:variable name="fld" select="/fm:FMPXMLRESULT/fm:METADATA/fm:FIELD" />
<xsl:variable name="ediUserid" select="count($fld[following-sibling::fm:FIELD/@NAME = 'EdiUserid']) + 1" />
<xsl:variable name="guid" select="count($fld[following-sibling::fm:FIELD/@NAME = 'Param1']) + 1" />
<xsl:variable name="refid" select="count($fld[following-sibling::fm:FIELD/@NAME = 'Param2']) + 1" />
<xsl:variable name="sloid" select="count($fld[following-sibling::fm:FIELD/@NAME = 'Param3']) + 1" />
<xsl:variable name="password" select="count($fld[following-sibling::fm:FIELD/@NAME = 'Password']) + 1" />
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.visionwebqa.com" >
<soapenv:Header/>
<soapenv:Body>
<ser:Process>
<ser:username><xsl:value-of select="fm:COL[$ediUserid]"/></ser:username>
<ser:password><xsl:value-of select="fm:COL[$password]"/></ser:password>
<ser:guid></ser:guid>
<ser:refid><xsl:value-of select="fm:COL[$refid]"/></ser:refid>
<ser:sloid><xsl:value-of select="fm:COL[$sloid]"/></ser:sloid>
<ser:orderXml>
</ser:orderXml>
</ser:Process>
</soapenv:Body>
</soapenv:Envelope>
</xsl:template>
</xsl:stylesheet>
首先,命名空间声明不是属性。
至于为什么样式表从预期的位置删除xmlns:ser="http://services.visionwebqa.com"
声明*的原因,这是因为您在这里告诉它这样做:
exclude-result-prefixes="ser soapenv fm">
从列表中删除ser
前缀,声明将被复制到输出中。顺便说一句,你只需要在一个地方,而不是两个地方。如果您将它包含在xsl:stylesheet
开始标记中,那么您不需要在soapenv:Envelope
中重复它,反之亦然。
(*)请注意声明最终会出现在使用ser
前缀的第一个元素上。从语义上讲,声明的确切位置对目标应用程序没有影响。