我有一个看起来像下面的XML。
我正在尝试使用每个Image节点属性中的所有值填充文件制作者记录。
但是请注意,在所提供的XML中,如果一个Image节点被多次使用,由其文件ID定义,则其后续子元素不存在。
我有下面的当前示例xsl基本上工作但我想在样式表中添加条件评估,其中说: 用英语讲: 如果'key'元素不存在,则找到第一个前面的匹配并使用这些元素中的值。同样适用于'string和'reel'元素。
结果将使用所有相关数据填充每个记录列,而不是现在有时只有这些重复文件的部分数据。
为我糟糕的描述道歉。
非常感谢任何帮助。
XML:
<?xml version="1.0"?>
<xmeml>
<boxset>
<stream>
<track>
<image>
<start>0</start>
<end>90</end>
<file id="abcde">
<key>95</key>
<string>1023</string>
<time>
<reel>142</reel>
</time>
</file>
</image>
<image>
<start>90</start>
<end>120</end>
<file id="bcdef">
<key>55</key>
<string>1023</string>
<time>
<reel>64</reel>
</time>
</file>
</image>
</track>
<track>
<image>
<start>120</start>
<end>130</end>
<file id="abcde"/>
</image>
<image>
<start>130</start>
<end>180</end>
<file id="cdefg">
<key>92</key>
<string>1023</string>
<time>
<reel>194</reel>
</time>
</file>
</image>
</track>
</stream>
</boxset>
</xmeml>
XSLT:
<?xml version='1.0' encoding='UTF-8' ?>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='/'>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
<ERRORCODE>0</ERRORCODE>
<PRODUCT BUILD="11/13/2002" NAME="Filemaker Pro" VERSION="6.0V4"/>
<DATABASE DATEFORMAT="d/M/yyyy" LAYOUT="" NAME="combotest.fp7" RECORDS="" TIMEFORMAT="h:mm:ss a"/>
<METADATA>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="start" TYPE="NUMBER"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="end" TYPE="NUMBER"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="fileID" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="key" TYPE="NUMBER"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="string" TYPE="NUMBER"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="reel" TYPE="NUMBER"/>
</METADATA>
<xsl:for-each select=" //image ">
<RESULTSET FOUND="">
<ROW MODID="" RECORDID="">
<COL><DATA><xsl:value-of select="./start" /></DATA></COL>
<COL><DATA><xsl:value-of select="./end" /></DATA></COL>
<COL><DATA><xsl:value-of select="./file/@id" /></DATA></COL>
<COL><DATA><xsl:value-of select="./file/key" /></DATA></COL>
<COL><DATA><xsl:value-of select="./file/string" /></DATA></COL>
<COL><DATA><xsl:value-of select="./file/time/reel" /></DATA></COL>
</ROW>
</xsl:for-each>
</RESULTSET></FMPXMLRESULT>
</xsl:template>
</xsl:stylesheet>
如果要填充XML,我们希望看到它看起来像这样。
理想的XML:
<?xml version="1.0"?>
<xmeml>
<boxset>
<stream>
<track>
<image>
<start>0</start>
<end>90</end>
<file id="abcde">
<key>95</key>
<string>1023</string>
<time>
<reel>142</reel>
</time>
</file>
</image>
<image>
<start>90</start>
<end>120</end>
<file id="bcdef">
<key>55</key>
<string>1023</string>
<time>
<reel>64</reel>
</time>
</file>
</image>
</track>
<track>
<image>
<start>120</start>
<end>130</end>
<!-- ideal data for repeated file "abcde" -->
<file id="abcde">
<key>95</key>
<string>1023</string>
<time>
<reel>142</reel>
</time>
</file>
<!-- end ideal repeated data -->
</image>
<image>
<start>130</start>
<end>180</end>
<file id="cdefg">
<key>92</key>
<string>1023</string>
<time>
<reel>194</reel>
</time>
</file>
</image>
</track>
</stream>
</boxset>
</xmeml>
答案 0 :(得分:1)
您需要定义一个XSLT密钥,以通过其ID来查找文件定义:
<xsl:key name="file" match="file[*]" use="@id" />
此处[*]
谓词确保仅具有至少一个子元素的file
将被其id编入索引。由于每个文件只有一个这样的定义,这正是我们所需要的。然后使用key()
函数找到定义:
...
<COL><DATA><xsl:value-of select="./end" /></DATA></COL>
<xsl:variable name="file" select="key('file', file/@id)" />
<COL><DATA><xsl:value-of select="$file/@id" /></DATA></COL>
<COL><DATA><xsl:value-of select="$file/key" /></DATA></COL>
<COL><DATA><xsl:value-of select="$file/string" /></DATA></COL>
<COL><DATA><xsl:value-of select="$file/time/reel" /></DATA></COL>
...
XSLT key
被添加到样式表的顶层(即xsl:template
,xsl:output
等。)