我试图从Filemaker数据库中的数据构建一个xml文件。我可以使XML的基本结构工作,但是在以正确的方式呈现门户行时遇到了问题。
这是我努力实现的最终结果。
<product>
<model>Model</model>
<caliber>Caliber</caliber>
<submodel>Sub Model</submodel>
<Dimensions>
<label>Overall length</label>
<label>Overall height</label>
<value>178 mm</value>
<value>138 mm</value>
</Dimensions>
<weight>
<label>Overall weight</label>
<label>with magazine</label>
<value>739 g</value>
<value>91 g</value>
</weight>
</product>
Model和Calibre和Submodel项是我数据库中表的字段。尺寸和重量从相关的表中拉出来作为门户。关系键是模型。
每个门户网站行作为类别,标签和值。
我试图在XSL文件中编写一个if语句,它将获取所有门户行,其类别为&#34; Dimensions&#34;并将它们组合在一起。重量相同。
这是我当前正在使用的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>
<xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">
<model>
<xsl:value-of select="fmp:COL[2]/fmp:DATA"/>
</model>
<caliber>
<xsl:value-of select="fmp:COL[1]/fmp:DATA"/>
</caliber>
<submodel>
<xsl:value-of select="fmp:COL[4]/fmp:DATA"/>
</submodel>
<specs>
<xsl:for-each select="fmp:COL[10]/fmp:DATA">
<category>
<xsl:value-of select="."/>
</category>
</xsl:for-each>
<xsl:for-each select="fmp:COL[8]/fmp:DATA">
<label>
<xsl:value-of select="."/>
</label>
</xsl:for-each>
<xsl:for-each select="fmp:COL[9]/fmp:DATA">
<value>
<xsl:value-of select="."/>
</value>
</xsl:for-each>
</specs>
</xsl:for-each>
</product>
</xsl:template>
</xsl:stylesheet>
这将输出我需要的所有信息,但将门户行中的所有类别放在一起。我对XSL很新,也不知道如何制定if语句。
我需要将内部信息更改为if语句。 这就是我在玩的东西:
<xsl:if test="fmp:COL[10]/fmp:DATA= 'Dimensions'">
<Dimensions>
<label>Overall length</label>
<label>Overall height</label>
<value>178 mm</value>
<value>138 mm</value>
</Dimensions>
</xsl:if>
以下是Filemaker的原始导出。
<?xml version="1.0" encoding="UTF-8"?>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
<ERRORCODE>0</ERRORCODE>
<PRODUCT BUILD="03-15-2012" NAME="FileMaker" VERSION="ProAdvanced 12.0v1" />
<DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="" NAME="HK Product Database.fmp12" RECORDS="61" TIMEFORMAT="h:mm:ss a" />
<METADATA>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Caliber" TYPE="TEXT" />
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Model" TYPE="TEXT" />
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="ModelID" TYPE="TEXT" />
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="PrimaryCategory" TYPE="TEXT" />
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="ProductID" TYPE="TEXT" />
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="SubModel" TYPE="TEXT" />
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Models::WP Post ID" TYPE="NUMBER" />
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Specs::SpecLabel" TYPE="TEXT" />
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Specs::SpecData" TYPE="TEXT" />
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Specs::SpecCategory" TYPE="TEXT" />
</METADATA>
<RESULTSET FOUND="61">
<ROW MODID="1" RECORDID="196">
<COL>
<DATA>9 mm x 19</DATA>
</COL>
<COL>
<DATA>P59</DATA>
</COL>
<COL>
<DATA>P59</DATA>
</COL>
<COL>
<DATA>Semi-Automatic Pistols</DATA>
</COL>
<COL>
<DATA>P30-9</DATA>
</COL>
<COL>
<DATA>P30</DATA>
</COL>
<COL>
<DATA>181</DATA>
</COL>
<COL>
<DATA>Overall length</DATA>
<DATA>Overall height</DATA>
<DATA>Overall width w/lever</DATA>
<DATA>Barrel length</DATA>
<DATA>Sight radius</DATA>
<DATA>With magazine</DATA>
<DATA>Magazine</DATA>
<DATA>Magazine capacity</DATA>
<DATA>Trigger system</DATA>
<DATA>Trigger pull (N)</DATA>
<DATA>Trigger travel</DATA>
<DATA>Sights</DATA>
</COL>
<COL>
<DATA>178 mm</DATA>
<DATA>138 mm</DATA>
<DATA>35 mm</DATA>
<DATA>98 mm</DATA>
<DATA>149 mm</DATA>
<DATA>739 g</DATA>
<DATA>91 g</DATA>
<DATA>15 Cartridges</DATA>
<DATA>SA/DA</DATA>
<DATA>* 20 + 4/-2 (SA)
51 +/- 5 (DA)</DATA>
<DATA>.25 inch (SA)
< .55 inch (DA)</DATA>
<DATA>Fixed (Open square notch rear sight with contrast points)</DATA>
</COL>
<COL>
<DATA>Dimensions</DATA>
<DATA>Dimensions</DATA>
<DATA>Dimensions</DATA>
<DATA>Dimensions</DATA>
<DATA>Dimensions</DATA>
<DATA>Weight</DATA>
<DATA>Weight</DATA>
<DATA>Other Specifications</DATA>
<DATA>Other Specifications</DATA>
<DATA>Other Specifications</DATA>
<DATA>Other Specifications</DATA>
<DATA>Other Specifications</DATA>
</COL>
</ROW>
</RESULTSET>
</FMPXMLRESULT>
它无法正常工作。任何帮助将不胜感激!
编辑:
以下是我在哪里的更新: 这个样式表:
<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>
<xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">
<model>
<xsl:value-of select="fmp:COL[2]/fmp:DATA"/>
</model>
<productID>
<xsl:value-of select="fmp:COL[5]/fmp:DATA"/>
</productID>
<caliber>
<xsl:value-of select="fmp:COL[1]/fmp:DATA"/>
</caliber>
<submodel>
<xsl:value-of select="fmp:COL[4]/fmp:DATA"/>
</submodel>
<xsl:if test="fmp:COL[10]/fmp:DATA= 'Dimensions'">
<Dimensions>
<xsl:value-of select="."/>
</Dimensions>
</xsl:if>
<specs>
<xsl:for-each select="fmp:COL[10]/fmp:DATA">
<category>
<xsl:value-of select="."/>
</category>
</xsl:for-each>
<xsl:for-each select="fmp:COL[8]/fmp:DATA">
<label>
<xsl:value-of select="."/>
</label>
</xsl:for-each>
<xsl:for-each select="fmp:COL[9]/fmp:DATA">
<value>
<xsl:value-of select="."/>
</value>
</xsl:for-each>
</specs>
</xsl:for-each>
</product>
</xsl:template>
</xsl:stylesheet>
呈现此XML:
<product>
<model>P30</model>
<productID>P30-9</productID>
<caliber>9 mm x 19</caliber>
<submodel>Semi-Automatic Pistols</submodel>
<Dimensions>9 mm x 19P30P30Semi-Automatic PistolsP30-9P30181Overall lengthOverall heightOverall width w/leverBarrel lengthSight radiusWith magazineMagazineMagazine capacityTrigger systemTrigger pull (N)Trigger travelSights178 mm138 mm35 mm98 mm149 mm739 g91 g15 CartridgesSA/DA* 20 + 4/-2 (SA)
51 +/- 5 (DA).25 inch (SA)
< .55 inch (DA)Fixed (Open square notch rear sight with contrast points)
DimensionsDimensionsDimensionsDimensionsDimensionsWeightWeightOther SpecificationsOther SpecificationsOther SpecificationsOther SpecificationsOther Specifications</Dimensions>
<specs>
<category>Dimensions</category>
<category>Dimensions</category>
<category>Dimensions</category>
<category>Dimensions</category>
<category>Dimensions</category>
<category>Weight</category>
<category>Weight</category>
<category>Other Specifications</category>
<category>Other Specifications</category>
<category>Other Specifications</category>
<category>Other Specifications</category>
<category>Other Specifications</category>
<label>Overall length</label>
<label>Overall height</label>
<label>Overall width w/lever</label>
<label>Barrel length</label>
<label>Sight radius</label>
<label>With magazine</label>
<label>Magazine</label>
<label>Magazine capacity</label>
<label>Trigger system</label>
<label>Trigger pull (N)</label>
<label>Trigger travel</label>
<label>Sights</label>
<value>178 mm</value>
<value>138 mm</value>
<value>35 mm</value>
<value>98 mm</value>
<value>149 mm</value>
<value>739 g</value>
<value>91 g</value>
<value>15 Cartridges</value>
<value>SA/DA</value>
<value>* 20 + 4/-2 (SA)
51 +/- 5 (DA)</value>
<value>.25 inch (SA)
< .55 inch (DA)</value>
<value>Fixed (Open square notch rear sight with contrast points)
</value>
</specs>
</product>
使用相同的源XML。尺寸if语句正在起作用,但现在只需将内容分开。
答案 0 :(得分:1)
这样的事情对你有用吗?
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fmp="http://www.filemaker.com/fmpxmlresult"
exclude-result-prefixes="fmp">
<xsl:output method="xml" version="1.0" encoding="windows-1251" indent="yes"/>
<xsl:template match="/">
<product>
<xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">
<model>
<xsl:value-of select="fmp:COL[2]/fmp:DATA"/>
</model>
<caliber>
<xsl:value-of select="fmp:COL[1]/fmp:DATA"/>
</caliber>
<submodel>
<xsl:value-of select="fmp:COL[4]/fmp:DATA"/>
</submodel>
<Dimensions>
<xsl:for-each select="fmp:COL[10]/fmp:DATA[.='Dimensions']">
<xsl:variable name="i" select="count(preceding-sibling::fmp:DATA) + 1" />
<label><xsl:value-of select="../../fmp:COL[8]/fmp:DATA[$i]"/></label>
<value><xsl:value-of select="../../fmp:COL[9]/fmp:DATA[$i]"/></value>
</xsl:for-each>
</Dimensions>
<Weight>
<xsl:for-each select="fmp:COL[10]/fmp:DATA[.='Weight']">
<xsl:variable name="i" select="count(preceding-sibling::fmp:DATA) + 1" />
<label><xsl:value-of select="../../fmp:COL[8]/fmp:DATA[$i]"/></label>
<value><xsl:value-of select="../../fmp:COL[9]/fmp:DATA[$i]"/></value>
</xsl:for-each>
</Weight>
</xsl:for-each>
</product>
</xsl:template>
</xsl:stylesheet>
根据您的输入,获得以下结果:
<?xml version="1.0" encoding="windows-1251"?>
<product>
<model>P59</model>
<caliber>9 mm x 19</caliber>
<submodel>Semi-Automatic Pistols</submodel>
<Dimensions>
<label>Overall length</label>
<value>178 mm</value>
<label>Overall height</label>
<value>138 mm</value>
<label>Overall width w/lever</label>
<value>35 mm</value>
<label>Barrel length</label>
<value>98 mm</value>
<label>Sight radius</label>
<value>149 mm</value>
</Dimensions>
<Weight>
<label>With magazine</label>
<value>739 g</value>
<label>Magazine</label>
<value>91 g</value>
</Weight>
</product>
当然,更好的结构会将标签和值组合在一个共同的父元素下。
要执行上述操作,请替换:
<label><xsl:value-of select="../../fmp:COL[8]/fmp:DATA[$i]"/></label>
<value><xsl:value-of select="../../fmp:COL[9]/fmp:DATA[$i]"/></value>
使用:
<value label="{../../fmp:COL[8]/fmp:DATA[$i]}">
<xsl:value-of select="../../fmp:COL[9]/fmp:DATA[$i]"/>
</value>
答案 1 :(得分:1)
这是我建议的样式表:
<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="/">
<xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">
<product id="{fmp:COL[5]/fmp:DATA}">
<model>
<xsl:value-of select="fmp:COL[2]/fmp:DATA"/>
</model>
<caliber>
<xsl:value-of select="fmp:COL[1]/fmp:DATA"/>
</caliber>
<submodel>
<xsl:value-of select="fmp:COL[4]/fmp:DATA"/>
</submodel>
<dimensions>
<xsl:for-each select="fmp:COL[10]/fmp:DATA[text()='Dimensions']">
<xsl:variable name="category-position" select="count(preceding-sibling::*) + 1"/>
<xsl:variable name="label" select="ancestor::fmp:ROW/fmp:COL[8]/fmp:DATA[$category-position]"/>
<xsl:if test="$label = 'Overall length' or $label = 'Overall height'">
<value label="{$label}"><xsl:value-of select="ancestor::fmp:ROW/fmp:COL[9]/fmp:DATA[$category-position]"/></value>
</xsl:if>
</xsl:for-each>
</dimensions>
<weight>
<xsl:for-each select="fmp:COL[10]/fmp:DATA[text()='Weight']">
<xsl:variable name="category-position" select="count(preceding-sibling::*) + 1"/>
<value label="{ancestor::fmp:ROW/fmp:COL[8]/fmp:DATA[$category-position]}"><xsl:value-of select="ancestor::fmp:ROW/fmp:COL[9]/fmp:DATA[$category-position]"/></value>
</xsl:for-each>
</weight>
</product>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
输出:
<?xml version="1.0" encoding="windows-1251"?>
<product id="P30-9">
<model>P59</model>
<caliber>9 mm x 19</caliber>
<submodel>Semi-Automatic Pistols</submodel>
<dimensions>
<value label="Overall length">178 mm</value>
<value label="Overall height">138 mm</value>
</dimensions>
<weight>
<value label="With magazine">739 g</value>
<value label="Magazine">91 g</value>
</weight>
</product>
我注意到您只需要输出中的两个维度值,因此我添加了基于label
的过滤器。
注意:以下内容适用于早期版本的样式表。我改变它以创建一个更像我在下面描述的结果。
您的输出XML是否已指定?因为我认为可以改进XML-y:
<dimensions>
<dimension label="Overall length">178 mm</dimension>
<dimension label="Overall height">139 mm</dimension>
</dimensions>
或者,如果您事先知道您的键/值对是什么:
<dimensions length="178mm" height="139mm"/>
如果您可以控制输出XML的设计,那么也可以利用其功能而不是模拟笨拙的Filemaker输出。除了位置以外什么都没有连接的<label/>
和<value/>
对非常非XML,最好将它们组合成一个元素!