通过xslt导出filemaker xml
我试图从Filemaker数据库中导出一些数据,并通过XSLT进行转换 我已经掌握了大部分的方法,但是我被一些嵌套数据卡住了: XML输出的当前结构为:通过xslt导出filemaker xml,xml,xslt,loops,filemaker,Xml,Xslt,Loops,Filemaker,我试图从Filemaker数据库中导出一些数据,并通过XSLT进行转换 我已经掌握了大部分的方法,但是我被一些嵌套数据卡住了: XML输出的当前结构为: <?xml version="1.0" encoding="UTF-8"?> <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult"> <ERRORCODE>0</ERRORCODE> <PRODUCT
<?xml version="1.0" encoding="UTF-8"?>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
<ERRORCODE>0</ERRORCODE>
<PRODUCT BUILD="07-18-2011" NAME="FileMaker" VERSION="ProAdvanced 11.0v4"/>
<DATABASE DATEFORMAT="D/m/yyyy" LAYOUT="" NAME="bubbles.fp7" RECORDS="34604" TIMEFORMAT="k:mm:ss "/>
<METADATA>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="description intro" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Description Line 1" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Description Line 2" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="description short" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="description W3" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Destination URL" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="EAN Code" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="product code W1" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="product group name" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="product name W6" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="stock_for_sale_quantity" TYPE="NUMBER"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="UPC Code" TYPE="NUMBER"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="web link standard" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="products_ADDITIONAL_IMAGES::full url" TYPE="TEXT"/>
</METADATA>
<RESULTSET FOUND="6">
<ROW MODID="5678" RECORDID="5051">
<COL>
<DATA>description info here</DATA>
</COL>
<COL>
<DATA> desc line 1</DATA>
</COL>
<COL>
<DATA>desc line 2</DATA>
</COL>
<COL>
<DATA>short description here</DATA>
</COL>
<COL>
<DATA>
Reall long description goes in here</DATA>
</COL>
<COL>
<DATA>url to product</DATA>
</COL>
<COL>
<DATA/>
</COL>
<COL>
<DATA>SKU</DATA>
</COL>
<COL>
<DATA>Acoustic guitars</DATA>
</COL>
<COL>
<DATA>Epiphone EJ-200 Acoustic Guitar Vintage Sunburst EJ200</DATA>
</COL>
<COL>
<DATA>0</DATA>
</COL>
<COL>
<DATA>711106264509</DATA>
</COL>
<COL>
<DATA>http://www.mywebsite.co.uk/catalog/product/view/id/15186</DATA>
</COL>
<COL>
<DATA>http://www.mywebsite.co.uk/store/images/uploads/additional/epiej200vsbrst_01.jpg</DATA>
<DATA>http://www.mywebsite.co.uk/store/images/uploads/additional/epiej200vsbrst_02.jpg</DATA>
<DATA>http://www.mywebsite.co.uk/store/images/uploads/additional/epiej200vsbrst_03.jpg</DATA>
<DATA>http://www.mywebsite.co.uk/store/images/uploads/additional/epiej200vsbrst_04.jpg</DATA>
<DATA>http://www.mywebsite.co.uk/store/images/uploads/additional/epiej200vsbrst_05.jpg</DATA>
<DATA>http://www.mywebsite.co.uk/store/images/uploads/additional/epiej200vsbrst_06.jpg</DATA>
<DATA>http://www.mywebsite.co.uk/store/images/uploads/epiej200vsbrst.jpg</DATA>
</COL>
</ROW>
0
描述信息在这里
描述第1行
描述第2行
这里有简短的描述
这里有很长的描述
产品的url
SKU
原声吉他
Epiphone EJ-200原声吉他复古Sunburst EJ200
0
711106264509
http://www.mywebsite.co.uk/catalog/product/view/id/15186
http://www.mywebsite.co.uk/store/images/uploads/additional/epiej200vsbrst_01.jpg
http://www.mywebsite.co.uk/store/images/uploads/additional/epiej200vsbrst_02.jpg
http://www.mywebsite.co.uk/store/images/uploads/additional/epiej200vsbrst_03.jpg
http://www.mywebsite.co.uk/store/images/uploads/additional/epiej200vsbrst_04.jpg
http://www.mywebsite.co.uk/store/images/uploads/additional/epiej200vsbrst_05.jpg
http://www.mywebsite.co.uk/store/images/uploads/additional/epiej200vsbrst_06.jpg
http://www.mywebsite.co.uk/store/images/uploads/epiej200vsbrst.jpg
我的XSL在某种程度上是有效的,但我无法让它挑出每个图像:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fmp="http://www.filemaker.com/fmpxmlresult" version="1.0" exclude-result-prefixes="fmp">
<xsl:output method="xml" version="1.0" encoding="windows-1251" indent="yes"/>
<xsl:template match="/">
<product>
<product_count>
<xsl:value-of select="count(//fmp:ROW)"/>
</product_count>
<xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">
<product_info>
<description_info>
<xsl:value-of select="fmp:COL[1]/fmp:DATA"/>
</description_info>
<desc_line_1>
<xsl:value-of select="fmp:COL[2]/fmp:DATA"/>
</desc_line_1>
<desc_line_2>
<xsl:value-of select="fmp:COL[3]/fmp:DATA"/>
</desc_line_2>
<short_description>
<xsl:value-of select="fmp:COL[4]/fmp:DATA"/>
</short_description>
<long_description>
<xsl:value-of select="fmp:COL[5]/fmp:DATA"/>
</long_description>
<dest_url>
<xsl:value-of select="fmp:COL[6]/fmp:DATA"/>
</dest_url>
<ean>
<xsl:value-of select="fmp:COL[7]/fmp:DATA"/>
</ean>
<sku>
<xsl:value-of select="fmp:COL[8]/fmp:DATA"/>
</sku>
<group_name>
<xsl:value-of select="fmp:COL[9]/fmp:DATA"/>
</group_name>
<product_name>
<xsl:value-of select="fmp:COL[10]/fmp:DATA"/>
</product_name>
<stock_level>
<xsl:value-of select="fmp:COL[11]/fmp:DATA"/>
</stock_level>
<upc>
<xsl:value-of select="fmp:COL[12]/fmp:DATA"/>
</upc>
<web_link>
<xsl:value-of select="fmp:COL[13]/fmp:DATA"/>
</web_link>
<position>
<xsl:value-of select="fmp:DATA"/>
</position>
<images>
<xsl:variable name="count" select="count(fmp:COL[14]/fmp:DATA)"/>
<image_count>
<xsl:value-of select="$count"/>
</image_count>
<xsl:for-each select="fmp:COL[14]/fmp:DATA[position()<=$count]">
<img>
<xsl:value-of select="position()"/>
</img>
</xsl:for-each>
</images>
</product_info>
</xsl:for-each>
</product>
</xsl:template>
这是有效的,除了位给我正确的标签数量,但没有数据
<images>
<image_count>7</image_count>
<img/>
<img/>
<img/>
<img/>
<img/>
<img/>
<img/>
</images>
7.
有人能帮你完成最后一个小循环吗?你让事情变得比你需要的复杂得多:
<xsl:for-each select="fmp:COL[14]/fmp:DATA">
<img>
<xsl:value-of select="."/>
</img>
</xsl:for-each>
我会给你
<img>http://www.absolutemusic.co.uk/store/images/uploads/additional/epiej200vsbrst_01.jpg</img>
<img>http://www.absolutemusic.co.uk/store/images/uploads/additional/epiej200vsbrst_02.jpg</img>
....
http://www.absolutemusic.co.uk/store/images/uploads/additional/epiej200vsbrst_01.jpg
http://www.absolutemusic.co.uk/store/images/uploads/additional/epiej200vsbrst_02.jpg
....
顺便说一句,我过去不得不编写filemaker XSLT,为了保持头脑清醒(不必记住每个字段的正确列索引),我使用了如下技巧:
<xsl:variable name="mdf" select="/fmp:FMPXMLRESULT/fmp:METADATA/fmp:FIELD" />
<xsl:variable name="descIntro" select="count($mdf[
following-sibling::fmp:FIELD/@NAME = 'description intro']) + 1" />
<xsl:variable name="descL1" select="count($mdf[
following-sibling::fmp:FIELD/@NAME = 'Description Line 1']) + 1" />
等等。这将为每个字段名创建一个变量,其中包含该字段的正确索引,因此您可以使用类似
fmp:COL[$images]
的表达式,而不是fmp:COL[14]
。这还有一个额外的优点,即如果您以后更改导出定义以包含XSLT自动补偿的其他字段,则不必手动修改所有数字。这就解决了问题-我看起来确实太难了现在就开始尝试变量命名-看起来很棒。谢谢这是一个很好的技巧,但是如果我有像SomeRecord::SomeField这样的名字,它是如何工作的呢?