Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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 Filemaker Pro中的XSLT字段名_Xml_Xslt_Filemaker - Fatal编程技术网

Xml Filemaker Pro中的XSLT字段名

Xml Filemaker Pro中的XSLT字段名,xml,xslt,filemaker,Xml,Xslt,Filemaker,我是XSLT新手,我正在尝试使用fmpxmlresult语法转换从Filemaker Pro生成的XML文件。 Filemaker以以下方式输出原始XML: <?xml version="1.0" encoding="UTF-8"?> <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult"> <ERRORCODE>0</ERRORCODE> <PRODUCT BUIL

我是XSLT新手,我正在尝试使用fmpxmlresult语法转换从Filemaker Pro生成的XML文件。 Filemaker以以下方式输出原始XML:

<?xml version="1.0" encoding="UTF-8"?>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
   <ERRORCODE>0</ERRORCODE>
   <PRODUCT BUILD="02-13-2018" NAME="FileMaker" VERSION="ProAdvanced 16.0.5" />
   <DATABASE DATEFORMAT="D/m/yyyy" LAYOUT="" NAME="fatture elettronica.fmp12" RECORDS="1" TIMEFORMAT="k:mm:ss " />
   <METADATA>
      <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="data" TYPE="DATE" />
      <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="ID" TYPE="TEXT" />
      <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="righe::descrizione" TYPE="TEXT" />
      <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="righe::prezzo" TYPE="TEXT" />
   </METADATA>
   <RESULTSET FOUND="1">
      <ROW MODID="1" RECORDID="1">
         <COL>
            <DATA>31/08/2018</DATA>
         </COL>
         <COL>
            <DATA>1</DATA>
         </COL>
         <COL>
            <DATA>patate</DATA>
            <DATA>pomodori</DATA>
            <DATA>uva</DATA>
         </COL>
         <COL>
            <DATA>100</DATA>
            <DATA>50</DATA>
            <DATA>70</DATA>
         </COL>
      </ROW>
   </RESULTSET>
</FMPXMLRESULT>

0
31/08/2018
1.
帕特
波莫多里
长波紫外线
100
50
70
在XSLT中,我使用

<xsl:value-of select="fmp:COL[1]/fmp:DATA"/>

它可以工作,但有点让人困惑,因为我有一个包含很多字段的XML文件,而且很容易按数字寻址错误的字段。 是否有方法使用元数据部分中列出的字段名称选择字段? 我试图搜索,但我甚至无法想象要查找的正确关键字。
感谢

在纯XSLT/XPath 1中,很难找到紧凑的表达式,例如,要选择相应的
字段
具有
名称
属性值
ID
的列,您需要像
这样的复杂选择:


您可以定义一个键来保存字段名,并使用count函数从中获取名称

像这样的

<!-- Define a key to get the first field and all fields that follow it by the field name -->
<xsl:key name="K" match="/fmp:FMPXMLRESULT/fmp:METADATA/fmp:FIELD" use="@NAME" />
<xsl:key name="K" match="/fmp:FMPXMLRESULT/fmp:METADATA/fmp:FIELD" use="following-sibling::fmp:FIELD/@NAME" />


<!-- Shortform to get a value for an attribute -->
<MyField  SomeAttr="{fmp:COL[count(key('K', 'SomeAttr'))]}"/>        

<!-- Format for getting a value for an element -->
<MyField>
    <xsl:value-of select="fmp:COL[count(key('K', 'MyField'))]/fmp:DATA" />
</MyField>    

这种方法还有一个优点,即如果在FileMaker中更改字段导出顺序,XSLT将保持不变。如果在FileMaker中更改字段名,只需更改XSLT中获取该字段的一条语句。

我用这种方法解决了:

<?xml version="1.0" encoding="UTF-8"?>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
   <ERRORCODE>0</ERRORCODE>
   <PRODUCT BUILD="02-13-2018" NAME="FileMaker" VERSION="ProAdvanced 16.0.5" />
   <DATABASE DATEFORMAT="D/m/yyyy" LAYOUT="" NAME="fatture elettronica.fmp12" RECORDS="1" TIMEFORMAT="k:mm:ss " />
   <METADATA>
      <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="data" TYPE="DATE" />
      <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="ID" TYPE="TEXT" />
      <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="righe::descrizione" TYPE="TEXT" />
      <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="righe::prezzo" TYPE="TEXT" />
   </METADATA>
   <RESULTSET FOUND="1">
      <ROW MODID="1" RECORDID="1">
         <COL>
            <DATA>31/08/2018</DATA>
         </COL>
         <COL>
            <DATA>1</DATA>
         </COL>
         <COL>
            <DATA>patate</DATA>
            <DATA>pomodori</DATA>
            <DATA>uva</DATA>
         </COL>
         <COL>
            <DATA>100</DATA>
            <DATA>50</DATA>
            <DATA>70</DATA>
         </COL>
      </ROW>
   </RESULTSET>
</FMPXMLRESULT>

然后我调用变量:

<xsl:value-of select="fmp:COL[$ID]/fmp:DATA"/>


Filemaker支持哪个版本的XSLT?或者您是否在Filemaker之外使用XSLT,并可以选择切换到XSLT 2或3处理器,如Saxon 9?它支持版本1,因此很难找到紧凑的表达式,使用XSLT 2或3,您可以定义自己的函数,该函数根据名称返回正确的索引/位置,然后使用例如
而不是
,正如我在中所做的那样。但是如果使用纯XSLT/XPath 1,则需要复杂的表达式,如
。FileMaker的FMPXMLRESULT语法旨在允许在不中断导出的情况下更改字段名。如果您更喜欢依赖字段名而不是字段顺序,请在导出时使用FMPDSORESULT语法-这将比您要求的容易得多。谢谢,但不幸的是,它给了我一个错误。我这样求解:
然后我调用变量:
谢谢我用类似的方法求解:
然后我调用变量:
对于数量有限的字段,这种方法可以工作。由于您需要为每个字段定义一个变量,因此当您有几十个或数百个字段时,此方法很快就会成为需要维护的大量工作。
<xsl:value-of select="fmp:COL[$ID]/fmp:DATA"/>