创建一个正确的XSL文件,用于从filemaker导出数据

时间:2015-06-27 16:55:14

标签: xml xslt filemaker

我在Filemaker中有一个数据库,我想用这种布局导出xml格式的表:

<?xml version="1.0" encoding="UTF-8"?>
<ricette>
    <tipologia>Gelato al Latte</tipologia>
        <nome>Fior di Panna</nome>
            <ingrediente>BaseBiancaScirocco_2014 no condensato</ingrediente>
                <qta>1234</qta>
            <ingrediente>Panna Fresca 35%mg</ingrediente>
                <qta>1234</qta> 
            <ingrediente>Latte Intero Fresco AQ</ingrediente>
                <qta>1234</qta> 
    <tipologia>BaseGiallaScirocco</tipologia>
    ....
    ....
</ricette>

这是filemaker中的数据表:

http://postimg.org/image/hjoparu8b/

我创建了这个XSL导出文件:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fm="http://www.filemaker.com/fmpxmlresult" 
    exclude-result-prefixes="fm">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <!-- expected columns -->
    <xsl:variable name="TYPO" select="1" />
    <xsl:variable name="NAME" select="2" />
    <xsl:variable name="INGREDIENT" select="3" />
    <xsl:variable name="QTY" select="4" />

    <xsl:template match="/">
    <ricette>
      <xsl:for-each select="fm:FMPXMLRESULT/fm:RESULTSET/fm:ROW">
          <tipologia><xsl:value-of select="fm:COL[$TYPO]/fm:DATA"/></tipologia>
          <nome><xsl:value-of select="fm:COL[$NAME]/fm:DATA"/></nome>
          <ingrediente><xsl:value-of select="fm:COL[$INGREDIENT]/fm:DATA"/></ingrediente>
          <qta><xsl:value-of select="fm:COL[$QTY]/fm:DATA"/></qta>
      </xsl:for-each> 
    </ricette>
    </xsl:template>
</xsl:stylesheet>

但结果是:

<?xml version="1.0" encoding="UTF-8"?>

<ricette>

<tipologia>Gelato al Latte</tipologia>

<nome>Fior di Panna</nome>

<ingrediente>BaseBiancaScirocco_2014 no condensato</ingrediente>

<qta>1234</qta>

<tipologia>Gelato al Latte</tipologia>

<nome>Fior di Panna</nome>

<ingrediente>Panna Fresca 35%mg</ingrediente>

<qta>1234</qta>

<tipologia>Gelato al Latte</tipologia>

<nome>Fior di Panna</nome>

<ingrediente>Latte Intero Fresco AQ</ingrediente>

<qta>1234</qta>

...
...
<ricette>

在结果文件中,行与行之间存在大量空间,而不是标签。

1 个答案:

答案 0 :(得分:2)

  1. 它有什么不同?
  2. 为了让结果自动缩进 ,请启动 样式表:

    <xsl:stylesheet version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:fm="http://www.filemaker.com/fmpxmlresult" 
        xmlns:xalan="http://xml.apache.org/xalan"
        exclude-result-prefixes="fm xalan">
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4"/>
    

    然而,这将产生您显示的结果,因为您的 缩进不是基于输出的实际层次结构,其中 tipologianomeingredienteqta都是兄弟姐妹 彼此。

    为了获得预期输出中显示的假缩进,您 必须禁用自动缩进并插入所需的 空格作为文字文本,例如:

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fm="http://www.filemaker.com/fmpxmlresult" 
    exclude-result-prefixes="fm">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
    
    <!-- expected columns -->
    <xsl:variable name="TYPO" select="1" />
    <xsl:variable name="NAME" select="2" />
    <xsl:variable name="INGREDIENT" select="3" />
    <xsl:variable name="QTY" select="4" />
    
     <xsl:template match="/">
        <ricette>
            <xsl:text>&#10;</xsl:text>
            <xsl:for-each select="fm:FMPXMLRESULT/fm:RESULTSET/fm:ROW">
                <xsl:text>&#9;</xsl:text>
                <tipologia><xsl:value-of select="fm:COL[$TYPO]/fm:DATA"/></tipologia>
                <xsl:text>&#10;&#9;&#9;</xsl:text>
                <nome><xsl:value-of select="fm:COL[$NAME]/fm:DATA"/></nome>
                <xsl:text>&#10;&#9;&#9;&#9;</xsl:text>
                <ingrediente><xsl:value-of select="fm:COL[$INGREDIENT]/fm:DATA"/></ingrediente>
                <xsl:text>&#10;&#9;&#9;&#9;&#9;</xsl:text>
                <qta><xsl:value-of select="fm:COL[$QTY]/fm:DATA"/></qta>
                <xsl:text>&#10;</xsl:text>
            </xsl:for-each> 
        </ricette>
    </xsl:template>
    

  3. 另请注意,在您的预期输出中,似乎有分组 按名称的成分 - 但你的样式表没有做任何事情 实现这样的分组。

  4. 我不确定是什么导致双重回报;我建议你做 确保样式表仅使用LF或CR作为行分隔符,而不是 都。它也可能是由您的应用程序创建的工件 用于查看结果(特别是如果你在Windows上)。