使用XSLT的XML摘要

时间:2009-09-06 09:37:37

标签: xml xslt

我有一个XML文件目录...例如:

   result.xml
   result2.xml
   result3.xml
   resultNth.xml (because there is an unknown amount of files)

每个结果文件中的模式基本相同

    <Succeeded>
          <someStrongXMLObject>

          </someStrongXMLObject>
    </Succeeded>

我的问题是 - 我可以在该目录中包含1个名为results.xml的XML文件......以及将格式化结果的XSL文件...

我想从所有结果文件中创建摘要...以便所有这些文件中的数据都包含在摘要中。

这可能吗?不使用任何C# - 只是标准的XML,XSLT?

更新

我不期望一个解决方案,只是一个点头,是的可能,或一个响亮的没有..我需要实现一些C#。此外,我希望目录结构为YYYY / MM / DD - 这样我就可以获得摘要XML文件,它将递归思想子目录...并创建月度和年度摘要。

1 个答案:

答案 0 :(得分:2)

是的,这绝对是可能的。

它的简单程度取决于您的文件名和文件夹名称图案的可靠性。您可以使用document() function检查结果文件是否存在。使用递归来继续查找下一个按顺序命名的文件,直到结束。

从您的示例文件名中,可以使用以下XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <summary>
            <xsl:call-template name="getResults">
                <!--First call, use empty index -->
                <xsl:with-param name="index" />
            </xsl:call-template>
        </summary>
    </xsl:template>

    <xsl:template name="getResults">
        <xsl:param name="index" />
        <xsl:variable name="filename">
            <xsl:choose>
                <xsl:when test="$index =''">
                    <xsl:value-of select="concat('result', '.xml')" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="concat('result', $index, '.xml')" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:choose>
            <!--Check for the presence of the file -->
            <xsl:when test="document($filename)">
                <!--If it exists, then output something from the document-->
                <Result>
                    <xsl:attribute name="href">
                        <xsl:value-of select="$filename" />
                    </xsl:attribute>
                    <xsl:copy-of select="document($filename)/Succeeded" />
                </Result>
                <!--Then, call the function with a new index value to look for the next file-->
                <xsl:call-template name="getResults">
                    <xsl:with-param name="index">
                        <xsl:choose>
                            <!--If empty index, start at 1 -->
                            <xsl:when test="$index=''">
                                <xsl:value-of select="1" />
                            </xsl:when>
                            <xsl:otherwise>
                                <!--Add 1 to the previous index value -->
                                <xsl:value-of select="number($index+1)" />
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:with-param>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:comment>Done looking for Results. Found <xsl:value-of select="number($index)" /> files.</xsl:comment>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

我在与XSLT相同的文件夹中运行了3个结果文档(即result.xml,result1.xml,result2.xml)并生成以下输出:

<?xml version="1.0" encoding="utf-8"?>
<summary>
<Result href="result.xml">
<Succeeded>
        <someStrongXMLObject>

        </someStrongXMLObject>
    </Succeeded>
</Result>
<Result href="result1.xml">
<Succeeded>
        <someStrongXMLObject>

        </someStrongXMLObject>
    </Succeeded>
</Result>
<Result href="result2.xml">
<Succeeded>
        <someStrongXMLObject>

        </someStrongXMLObject>
    </Succeeded>
</Result>
<!--Done looking for Results. Found 3 files.-->
</summary>