Вот краткое и простое решение 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()
.