我正在尝试从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项是我数据库中表的字段 . 尺寸和重量从相关的表中拉出来作为门户 . 关系键是模型 .
每个门户行作为Category,Label和Value .
我正在尝试在XSL文件中编写一个if语句,该语句将获取具有“Dimensions”类别的所有门户行并将它们组合在一起 . 重量相同 .
这是我当前正在使用的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语句正在工作,但现在只需要分离该内容 .
2 回答
这是我建议的样式表:
输出:
我注意到你只想在输出中输入两个维度值,所以我添加了一个基于
label
的过滤器 .NOTE :以下内容适用于早期版本的样式表 . 我改变它以创建一个更像我在下面描述的结果 .
您的输出XML是否已指定?因为我认为可以改进XML-y:
或者,如果您事先知道您的键/值对是什么:
如果您可以控制输出XML的设计,那么也可以利用其功能而不是模拟笨拙的Filemaker输出 .
<label/>
和<value/>
对除了位置之外的任何东西都是非XML的,最好将它们组合成一个元素!这样的事情对你有用吗?
根据您的输入,获得以下结果:
当然,更好的结构会将标签和值组合在一个共同的父元素下 .
编辑:
要做到这一点,请替换:
有: