【发布时间】:2021-10-16 12:56:23
【问题描述】:
我正在编写一个 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>
【问题讨论】:
-
与您的问题无关,但如果您打算按字段名称选择值,最好使用 FMPDSORESULT 语法导出。 FMPXMLRESULT 语法专门用于按位置选择值 - 因此允许您更改字段名称而不会破坏导出。
-
@michael.hor257k,当我使用 FMPDSORESULT 导出时,我在 XML 中得到以下注释 因此使用 FMPXMLRESULT 的原因。我有理由忽略这一点吗?感谢你的帮助。这些年来,您一直是宝贵的资源!
-
我相信它自第 7 版以来已被弃用。如果您仍然喜欢使用 FMPXMLRESULT,为什么不按编号选择 COL?毕竟,您在导出时控制它们的顺序。