【问题标题】:Why isn't my xslt adding the 2nd attribute to an element?为什么我的 xslt 不向元素添加第二个属性?
【发布时间】: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?毕竟,您在导出时控制它们的顺序。

标签: xml xslt filemaker


【解决方案1】:

首先,命名空间声明不是属性。

至于您的样式表从您期望的位置删除xmlns:ser="http://services.visionwebqa.com" 声明的原因*,是因为您在这里告诉它这样做:

exclude-result-prefixes="ser soapenv fm">

从列表中删除 ser 前缀,声明将被复制到输出。顺便说一句,你只需要在一个地方,而不是两个地方。如果您将它包含在 xsl:stylesheet 开始标签中,那么您无需在 soapenv:Envelope 中重复它,反之亦然。


(*) 请注意,声明 确实 最终会出现在使用 ser 前缀的第一个元素上。从语义上讲,声明的确切位置应该对目标应用程序没有影响。

【讨论】:

  • 请注意,在某些情况下,命名空间声明的确切位置确实会产生影响,特别是如果命名空间前缀出现在元素或属性名称以外的位置(例如,在xsi:type 属性)。但这里不是这样。
猜你喜欢
  • 2013-01-18
  • 1970-01-01
  • 2013-08-25
  • 2013-08-12
  • 2011-02-13
  • 1970-01-01
  • 2012-07-09
  • 2018-07-20
  • 1970-01-01
相关资源
最近更新 更多