Filemaker XSL使用if语句

时间:2014-05-12 17:29:59

标签: xslt filemaker

我试图从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)
&lt; .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)
&lt; .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)
&lt; .55 inch (DA)</value>
<value>Fixed (Open square notch rear sight with contrast points)
</value>
</specs>
</product>

使用相同的源XML。尺寸if语句正在起作用,但现在只需将内容分开。

2 个答案:

答案 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,最好将它们组合成一个元素!