从生成的XML文档名称中汇总所有节点

时间:2016-01-14 22:07:34

标签: xml xslt xpath

我有一个像这样的“目录”XML文档:

<root>
    <N>A</N>
    <N>B</N>
    <!-- ... -->
    <N>Z</N>
</root>

许多单独的XML文档,其名称如下:

A_foo.xml
A_bar.xml
B_foo.xml
B_bar.xml
...
Z_foo.xml
Z_bar.xml

其中每个都包含一个数字,即A_foo.xml类似于:

<!-- A_foo.xml -->
<X>10</X>

我需要将每个子文档中的X中的所有值相加。我尝试过天真的XSLT / Xpath,如:

<xsl:variable select="sum(document('./path/to/', //N, '_foo.xml')//X")/>

但没有成功。

1 个答案:

答案 0 :(得分:1)

我相信在XSLT 1.0(浏览器支持的唯一版本)中,您必须在两次传递中执行此操作。试试这种方式:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/root">
    <!-- first pass -->
    <xsl:variable name="values">
        <xsl:for-each select="N">
            <value>
                <xsl:value-of select="document(concat('./path/to/', ., '_foo.xml'))/X  "/>
            </value>
        </xsl:for-each>
    </xsl:variable>
    <!-- output -->
    <p>
        <xsl:value-of select="sum(exsl:node-set($values)/value)"/>
    </p>
</xsl:template>

</xsl:stylesheet>