逗号分隔为Filemaker XSLT解析XML

时间:2014-06-24 14:02:29

标签: xml parsing xslt comma filemaker

我希望在单个xml标记内解析一组逗号分隔的图像URL,并将其作为单独的标记写出来。这超出了我目前的知识,我很难学习我需要做的很快就能完成这项工作。如果有人可以提供帮助,我们将不胜感激。

这是XML:

<Report>
    <Row1>
        <Reference>001</Reference>
        <Type>House</Type>
        <Location>New York</Estado>
        <Size>665.6</Size>
        <Images>http://www.example.com/001/image1.jpg,http://www.example.com/001/image2.jpg,http://www.example.com/001/image3.jpg,http://www.example.com/001/image4.jpg</Images>
    </Row1>
    <Row2>
        <Reference>056</Reference>
        <Type>Apartment</Type>
        <Location>Washington</Estado>
        <Size>147.5</Size>
        <Images>http://www.example.com/056/image1.jpg,http://www.example.com/056/image5.jpg,http://www.example.com/056/image8.jpg,http://www.example.com/056/image9.jpg</Images>
    </Row2>
    </Report>

这是我想要输出的内容:

<RESULTSET>
    <ROW>
        <COL><DATA>001</DATA></COL>
        <COL><DATA>House</DATA></COL>
        <COL><DATA>New York</DATA></COL>
        <COL><DATA>665.6</DATA></COL>
        <COL><DATA>http://www.example.com/001/image1.jpg</DATA></COL>
        <COL><DATA>http://www.example.com/001/image2.jpg</DATA></COL>
        <COL><DATA>http://www.example.com/001/image3.jpg</DATA></COL>
        <COL><DATA>http://www.example.com/001/image4.jpg</DATA></COL>
    </ROW>
    <ROW>
        <COL><DATA>056</DATA></COL>
        <COL><DATA>Apartment</DATA></COL>
        <COL><DATA>Washington</DATA></COL>
        <COL><DATA>147.5</DATA></COL>
        <COL><DATA>http://www.example.com/056/image1.jpg</DATA></COL>
        <COL><DATA>http://www.example.com/056/image5.jpg</DATA></COL>
        <COL><DATA>http://www.example.com/056/image8.jpg</DATA></COL>
        <COL><DATA>http://www.example.com/056/image9.jpg</DATA></COL>
    </ROW>
</RESULTSET>

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:2)

Images节点外,所有源节点都可以通过简单的模板进行处理,这些模板可以提取内容并在新结构中重新组织它们:

<xsl:template match="Report">
    <RESULTSET>
        <xsl:apply-templates/>
    </RESULTSET>
</xsl:template>

<xsl:template match="Report/*">
    <ROW>
        <xsl:apply-templates/>
    </ROW>
</xsl:template>

<xsl:template match="Report/*/*[not(self::Images)]">
    <COL><DATA>
        <xsl:value-of select="."/>
    </DATA></COL>
</xsl:template>

Images节点需要通过分隔符(,)拆分字符串。要在XSLT 1.0中实现此目的,您需要一个可以递归调用的命名模板。它将由匹配Images元素的模板调用:

<xsl:template match="Images">
    <xsl:call-template name="split">
        <xsl:with-param name="string" select="."/>
    </xsl:call-template>
</xsl:template>

命名模板split检查序列中是否有逗号。如果没有,它只返回包含在<COL><DATA>块中的内容。如果存在,则提取第一个元素,并且递归地由同一模板处理字符串的其余部分,直到处理完所有项目。结果将是<COL><DATA>块列表,每个块包含一个项目:

<xsl:template name="split">
    <xsl:param name="string"/>
    <xsl:param name="separator">,</xsl:param>
        <xsl:choose>
            <xsl:when test="contains($string, $separator)">
                <xsl:variable name="first-string" select="substring-before($string, $separator)"/>
                <xsl:variable name="rest" select="substring-after($string, concat($first-string,$separator))"/>
                <COL><DATA><xsl:value-of select="$first-string"/></DATA></COL>
                <xsl:call-template name="split">
                    <xsl:with-param name="string" select="$rest"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <COL><DATA><xsl:value-of select="$string"/></DATA></COL>
            </xsl:otherwise>
        </xsl:choose>
</xsl:template>

您可以在 XSLT Fiddle

中试用

答案 1 :(得分:2)

  

我最多可以拍摄36张照片。

恕我直言,你在这里走错了路。如果最多可以有36个图像,则还需要36个字段来保存它们。这不是一个好的结构。您应该为图像保留一个相关的表格,其中每个位置(?)可以包含任意数量的图像。

要导入图像,您可以导入相同的源文档两次(使用每个导入的专用样式表),或者首先将URL导入单个字段,作为返回分隔列表,然后将它们在Filemaker中分成单独的相关记录。当然,这两种都可以编写脚本。