0

我有一个如下所示的 XML。

我正在尝试使用每个 Image 节点属性中的所有值填充文件制作者记录。

但是请注意,在呈现的 XML 中,如果多次使用 Image 节点(由其文件 id 定义),则不存在其后续子元素。

我有下面的当前示例 xsl,它基本上可以正常工作,但我想在样式表中添加一个条件评估,上面写着:用英语:如果 'key' 元素不存在,则查找第一个前面的匹配项并使用这些值元素。这同样适用于“字符串”和“卷轴”元素。

结果将用所有相关数据填充每个记录列,而不是现在有时只是此类重复文件的部分数据。

为我糟糕的描述道歉。

任何帮助将不胜感激。

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

1 回答 1

1

您需要定义一个 XSLT 键以通过其 ID 查找文件定义:

<xsl:key name="file" match="file[*]" use="@id" />

这里的[*]谓词确保只有file具有至少一个子元素的 s 才会被它们的 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>
...

XSLTkey被添加到样式表的顶层(即在xsl:templatexsl:output等之间)。

于 2012-08-09T09:58:47.043 回答