首页 文章

Filemaker XSL使用if语句

提问于
浏览
1

我正在尝试从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)
&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 回答

  • 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 的过滤器 .

    NOTE :以下内容适用于早期版本的样式表 . 我改变它以创建一个更像我在下面描述的结果 .

    您的输出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的,最好将它们组合成一个元素!

  • 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>
    

相关问题