我希望在单个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>
感谢您提供任何帮助。
答案 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中分成单独的相关记录。当然,这两种都可以编写脚本。