Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XNK数据未填充到我的xslt代码中_Xml_Xslt_Filemaker - Fatal编程技术网

Xml XNK数据未填充到我的xslt代码中

Xml XNK数据未填充到我的xslt代码中,xml,xslt,filemaker,Xml,Xslt,Filemaker,这是我的第一个XSLT脚本,对XMLs或它们的工作原理一无所知 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/*"> <FMPXMLRESULT xmlns="http://www.fi

这是我的第一个XSLT脚本,对XMLs或它们的工作原理一无所知

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">      
    <xsl:template match="/*">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
            <ERRORCODE>0</ERRORCODE><PRODUCT BUILD="" NAME="" VERSION=""/>
            <DATABASE DATEFORMAT="" LAYOUT="" NAME="" RECORDS="" TIMEFORMAT=""/>
            <METADATA>

0
将XSLT映射到Filemaker的工作如下

                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="IncID" TYPE="TEXT"/>
            </METADATA>

我需要在下面的某个地方填充FM数据库 正在填充单个名称,但未填充XML数据

            <RESULTSET>
                <ROW>
                    <COL>
                        <DATA><xsl:value-of select="IncID"/></DATA>
                    </COL>
                </ROW>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>

下面是一个简短的XML文档,每次上传时文件名都会更改。 下面的一切都不能改变

<dataSet xmlns="http://www.ibm.com/xmlns/prod/cognos/dataSet/201006">
    <dataTable>
        <id>IncidentHeader</id>
        <row>
            <IncID>286996</IncID>
            <IncNumber>ZA-RDF-0190</IncNumber>
        </row>
    </dataTable>
    <dataTable>
        <id>IncidentRequests</id>
        <row>
            <IncID>286996</IncID>
            <ResID>2412136</ResID>
            <ReqID>7820453</ReqID>
            <RootReqFlag>Yes</RootReqFlag>
        </row>
        <row>
            <IncID>286996</IncID>
            <ResID>2258222</ResID>
            <ReqID>7820454</ReqID>
            <RootReqFlag>Yes</RootReqFlag>
        </row>
    </dataTable>
</dataSet>

附带标题
286996
ZA-RDF-0190
附带请求
286996
2412136
7820453
对
286996
2258222
7820454
对

XML有一个默认名称空间
xmlns=”http://www.ibm.com/xmlns/prod/cognos/dataSet/201006“
所有元素都与之关联。这个名称空间需要在XSLT中映射,并且应该使用名称空间前缀访问元素。此处
ns0
已用作前缀

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ns0="http://www.ibm.com/xmlns/prod/cognos/dataSet/201006">
这种情况下的输出将是

<RESULTSET>
    <ROW>
        <COL>
            <DATA>286996</DATA>
        </COL>
        <COL>
            <DATA>286996</DATA>
        </COL>
        <COL>
            <DATA>286996</DATA>
        </COL>
    </ROW>
</RESULTSET>


本例中的输出如下所示

<RESULTSET>
    <ROW>
        <COL>
            <DATA>286996</DATA>
        </COL>
    </ROW>
</RESULTSET>

286996

我假设您希望将所有数据导入到单个FileMaker表中。在这种情况下,您必须对源进行一些解析,因为源中似乎有两个表IncidentHeader和IncidentRequests,每个表都包含在相同的“dataTable”元素中。 但是,它们确实共享密钥字段IncID,然后可以使用该字段将IncNumber提取到IncidentRequest数据中

我想这应该能奏效

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/*">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult" xmlns:c="http://www.ibm.com/xmlns/prod/cognos/dataSet/201006">
            <ERRORCODE>0</ERRORCODE>
            <PRODUCT BUILD="" NAME="" VERSION=""/>
            <DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="" NAME="" RECORDS="{count(c:dataTable[c:id='IncidentRequests']/c:row)}" TIMEFORMAT="h:mm:ss a"/>
            <METADATA>
                <FIELD>
                    <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
                    <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
                    <xsl:attribute name="NAME">IncNumber</xsl:attribute>
                    <xsl:attribute name="TYPE">TEXT</xsl:attribute>
                </FIELD>
                <xsl:for-each select="c:dataTable[c:id='IncidentRequests']/c:row[position()=1]/*">
                    <FIELD>
                        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
                        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
                        <xsl:attribute name="NAME"><xsl:value-of select="name()"/></xsl:attribute>
                        <xsl:attribute name="TYPE">TEXT</xsl:attribute>
                    </FIELD>
                </xsl:for-each>
            </METADATA>
            <RESULTSET>
                <xsl:attribute name="FOUND"><xsl:value-of select="count(c:dataTable[c:id='IncidentRequests']/c:row)"/></xsl:attribute>
                <xsl:for-each select="c:dataTable[c:id='IncidentRequests']/c:row">
                    <xsl:variable name="incid">
                        <xsl:value-of select="c:IncID"/>
                    </xsl:variable>
                    <ROW>
                        <xsl:attribute name="MODID">0</xsl:attribute>
                        <xsl:attribute name="RECORDID">0</xsl:attribute>
                        <COL>
                            <DATA>
                                <xsl:value-of select="//c:dataTable[c:id='IncidentHeader']/c:row[c:IncID=$incid]/c:IncNumber"/>
                            </DATA>
                        </COL>  
                        <xsl:for-each select="child::*">
                            <COL>
                                <DATA>
                                    <xsl:value-of select="."/>
                                </DATA>
                            </COL>
                        </xsl:for-each>
                    </ROW>
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>

0
对
1.
数量增加
正文
对
1.
正文
0
0

输出是什么样子的?大多数输出XML元素在XSLT中都是硬编码的,除了从不正确的上下文访问的
IncID
元素。输出只是一个FileMaker数据库。这不起作用-要检索哪个
IncID
,或者需要所有值。输入XML还有一个默认名称空间
xmlns=”http://www.ibm.com/xmlns/prod/cognos/dataSet/201006“
未映射到XSLT中。这可能是XSLT没有返回值的另一个原因。是的,它可以工作,非常感谢,我从未想过我需要添加名称空间和ns0-非常感谢!!你并不孤单。搜索“XSLT默认名称空间”,您将找到659个从未想到过的人。这还不包括被明确删除的重复问题。可悲的是,很难找到办法阻止更多的人落入同样的陷阱。如果您这样做,Saxon会试图给您一个警告,但是Saxon可能更多地被有经验的用户使用,而不是第一次使用。
<xsl:value-of select="//ns0:IncID[1]" />
<RESULTSET>
    <ROW>
        <COL>
            <DATA>286996</DATA>
        </COL>
    </ROW>
</RESULTSET>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/*">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult" xmlns:c="http://www.ibm.com/xmlns/prod/cognos/dataSet/201006">
            <ERRORCODE>0</ERRORCODE>
            <PRODUCT BUILD="" NAME="" VERSION=""/>
            <DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="" NAME="" RECORDS="{count(c:dataTable[c:id='IncidentRequests']/c:row)}" TIMEFORMAT="h:mm:ss a"/>
            <METADATA>
                <FIELD>
                    <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
                    <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
                    <xsl:attribute name="NAME">IncNumber</xsl:attribute>
                    <xsl:attribute name="TYPE">TEXT</xsl:attribute>
                </FIELD>
                <xsl:for-each select="c:dataTable[c:id='IncidentRequests']/c:row[position()=1]/*">
                    <FIELD>
                        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
                        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
                        <xsl:attribute name="NAME"><xsl:value-of select="name()"/></xsl:attribute>
                        <xsl:attribute name="TYPE">TEXT</xsl:attribute>
                    </FIELD>
                </xsl:for-each>
            </METADATA>
            <RESULTSET>
                <xsl:attribute name="FOUND"><xsl:value-of select="count(c:dataTable[c:id='IncidentRequests']/c:row)"/></xsl:attribute>
                <xsl:for-each select="c:dataTable[c:id='IncidentRequests']/c:row">
                    <xsl:variable name="incid">
                        <xsl:value-of select="c:IncID"/>
                    </xsl:variable>
                    <ROW>
                        <xsl:attribute name="MODID">0</xsl:attribute>
                        <xsl:attribute name="RECORDID">0</xsl:attribute>
                        <COL>
                            <DATA>
                                <xsl:value-of select="//c:dataTable[c:id='IncidentHeader']/c:row[c:IncID=$incid]/c:IncNumber"/>
                            </DATA>
                        </COL>  
                        <xsl:for-each select="child::*">
                            <COL>
                                <DATA>
                                    <xsl:value-of select="."/>
                                </DATA>
                            </COL>
                        </xsl:for-each>
                    </ROW>
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>