Filemaker XSLT的XML逗号分隔解析

Filemaker XSLT的XML逗号分隔解析,xml,parsing,xslt,comma,filemaker,Xml,Parsing,Xslt,Comma,Filemaker,我希望在单个xml标记中解析一组以逗号分隔的房地产数据图像URL,并将它们作为单独的标记写出。这远远超出了我目前的知识范围,我真的很难知道我需要做什么才能足够快地完成这项工作。如果有人能帮忙,我将不胜感激 以下是XML: <Report> <Row1> <Reference>001</Reference> <Type>House</Type> <Location&

我希望在单个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>

001
房屋
纽约
665.6
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
056
公寓
华盛顿
147.5
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
这是我想要输出的内容:

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

001
房屋
纽约
665.6
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
056
公寓
华盛顿
147.5
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

感谢您提供的任何帮助。

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

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

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

,

您可以在此

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

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

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

,
您可以在此

我最多可以有36张图片

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

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

我最多可以有36张图片

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


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

您使用的是XSLT 1.0还是2.0?您好,它是1.0。这可能是个问题吗?@user3771050不是问题,但在XSLT 2.0或+中更容易解决。你是否总是有4张图片,或者你可以有更多或更少?嗨-是的,我可以有更多或更少。我忘了说清楚。我最多可以有36张图片。谢谢您的时间。您是使用XSLT1.0还是2.0?您好,这是1.0。这可能是个问题吗?@user3771050不是问题,但在XSLT 2.0或+中更容易解决。你是否总是有4张图片,或者你可以有更多或更少?嗨-是的,我可以有更多或更少。我忘了说清楚。我最多可以有36张图片。谢谢你的时间。嗨,很抱歉耽误了回到这个问题。即使未提供图像,也可以将其修改为最多包含36个图像。i、 e.它填充了尽可能多的字段,但剩余的字段为空?XSLT与我通常所做的完全不同,因此很难学习它。感谢您的帮助。这是可能的,但如果您仅限于XSLT1.0,情况会变得复杂。您需要另外两个模板:一个用于计算图像,另一个用于递归循环并为每个缺少的图像添加空块。大概还有20行代码。如果您使用XSLT 2.0.Hi,很抱歉延迟回到这个问题。即使未提供图像,也可以将其修改为最多包含36个图像。i、 e.它填充了尽可能多的字段,但剩余的字段为空?XSLT偏离了我通常的做法,因此很难实现