2010-06-08 83 views
1

我正在寻找使用列名称(而不是位置)从Filemaker中导出。目前我出口以下XSL样式表,按位置输出:Filemaker XSL按名称选择列

<?xml version="1.0" encoding="utf-8"?> 
<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"/> 
<xsl:template match="/"> 
    <people> 
    <xsl:for-each select="fm:FMPXMLRESULT/fm:RESULTSET/fm:ROW"> 
     <person> 
     <name> 
      <xsl:value-of select="fm:COL[01]/fm:DATA"/> 
     </name> 
     <location> 
      <xsl:value-of select="fm:COL[02]/fm:DATA"/> 
     </location> 
     </person> 
    </xsl:for-each> 
    </people> 
</xsl:template> 
</xsl:stylesheet> 

任何想法?谢谢。

+0

请提供您应用转换的(最小)XML文档。很少有人知道Filemaker文件的格式。 – 2010-06-08 19:08:43

回答

4

如果你只想让代码更易读,那么我会建议简单的东西,比如:

<!-- expected columns --> 
<xsl:variable name="NAME" value="1" /> 
<xsl:variable name="LOCATION" value="2" /> 
<!-- ... --> 
<people> 
    <xsl:for-each select="fm:FMPXMLRESULT/fm:RESULTSET/fm:ROW"> 
    <person> 
     <name> 
     <xsl:value-of select="fm:COL[$NAME]/fm:DATA"/> 
     </name> 
     <location> 
     <xsl:value-of select="fm:COL[$LOCATION]/fm:DATA"/> 
     </location> 
    </person> 
    </xsl:for-each> 
</people> 

BTW,与<xsl:value-of />可以省略fm:DATA,即使用:

<xsl:value-of select="fm:COL[$LOCATION] /> 

它会返回相同的结果。

如果您需要更复杂的东西,请解释。

更新:

要通过列名更难引用列,但可能有这样的事情:

<!-- Define a key to get a field and all fields that precede it by the field name --> 
<xsl:key name="N" match="/fm:FMPXMLRESULT/fm:METADATA/fm:FIELD" use="@NAME" /> 
<xsl:key name="N" match="/fm:FMPXMLRESULT/fm:METADATA/fm:FIELD" 
    use="following-sibling::fm:FIELD/@NAME" /> 
<!-- Then *count* them it in the code like that --> 
<people> 
    <xsl:for-each select="fm:FMPXMLRESULT/fm:RESULTSET/fm:ROW"> 
    <person> 
     <name> 
     <xsl:value-of select="fm:COL[count(key('N', 'name'))]" /> 
     </name> 
     <location> 
     <xsl:value-of select="fm:COL[count(key('N', 'location'))]" /> 
     </location> 
    </person> 
    </xsl:for-each> 
</people> 

并非完全优雅,但作品。

+0

这不是我想要做的。我希望能够按列名选择,这样如果用户重新组织列,导出仍然有效。 – 2010-06-08 15:46:32

+0

哦,我明白了。用另一个例子更新帖子。 – 2010-06-08 18:23:50

+0

谢谢!那正是我正在寻找的。干杯! – 2010-06-08 22:56:50