XSLT总和来自另一个文件的查找值

我想从以下2个
XML文件中获取特定学生的总数:

—文件:mark.xml —-

<marks>
  <mark type="HD">10</mark>
  <mark type="D">8</mark>
  <mark type="C">5</mark>
</marks>

—文件:studentRecord.xml —

<students>
  <student id="1234">
    <grade>HD</grade>
  </student>
  <student id="1234">
    <grade>C</grade>
  </student>
  <student id="1111">
    <grade>D</grade>
  </student>
</students>

如何获得ID为1234的学生的总分?它应该是15.

最佳答案 这是一个简单易用的XSLT解决方案(实际上它只是XPath):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my">
 <xsl:output method="text"/>

 <my:MarkValues>
        <marks>
            <mark type="HD">10</mark>
            <mark type="D">8</mark>
            <mark type="C">5</mark>
        </marks>
 </my:MarkValues>

 <xsl:template match="/*">
     <xsl:value-of select=
     "sum(document('')/*
           /my:MarkValues/*/*
               [@type = current()/*
                          [@id='1234']/grade
             ]
        )"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的XML文档(名为“studentRecord.xml”)时:

<students>
    <student id="1234">
        <grade>HD</grade>
    </student>
    <student id="1234">
        <grade>C</grade>
    </student>
    <student id="1111">
        <grade>D</grade>
    </student>
</students>

产生了想要的答案:

15

如果要将标记值保存在单独的文件中(不是如上所述嵌入到XSLT样式表中),则应稍微更改XPath表达式(只是document()函数的参数:

sum(document('mark.xml')/*/*
                     [@type = current()/*
                                     [@id='1234']/grade
                     ]
   )

说明:

>使用XSLT document()功能.
>使用XSLT current()功能.
>使用XPath sum()功能.

点赞