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="/">
<html>
<body>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd[artist='Bob Dylan']">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
**<xsl:value-of select="sum(catalog/cd[artist='Bob Dylan' and extra[not(contains(tests/test,'CD'))]]/price)"/>**
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XML代码:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<extra>
<tests>
<test>CDEF</test>
</tests>
<tests>
<test>QWER</test>
</tests>
<tests>
<test>UIOP</test>
</tests>
</extra>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Red</title>
<artist>Bob Dylan</artist>
<country>UK</country>
<extra>
<tests>
<test>CDEF</test>
</tests>
<tests>
<test>QWER</test>
</tests>
<tests>
<test>UIOP</test>
</tests>
</extra>
<company>London</company>
<price>7.80</price>
<year>1987</year>
</cd>
<cd>
<title>Unchain my heart</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<extra>
<tests>
<test>ABXY</test>
</tests>
<tests>
<test>QWER</test>
</tests>
<tests>
<test>CDOP</test>
</tests>
</extra>
<company>EMI</company>
<price>8.5</price>
<year>1987</year>
</cd>
</catalog>
在XSLT中,我想将所有具有艺术家的总和作为Bob Dylan,并且我想确保只检索字符串中不包含CD的测试。
基于结果,我服用8.5。从我发现的内容来看,我的查询忽略了 2-n 中的值。我需要怎么做才能解决这些问题?
I've tried extra[not(contains(tests/test,'CD'))] not(contains(extra/tests/test))], extra/tests[not(contains(tests,CD))]
我一直在抓稻草,所以我很乐意让别人启发我。预先感谢!
答案 0 :(得分:1)
在您的原始XSLT中,您的表达式中已经包含了此内容...
wordDocument.SaveAs(@"E:\Report\word.docx").Close();
extra[not(contains(tests/test,'CD'))]
是一个字符串函数,它以2个字符串作为参数。如果将其传递给节点,它将首先将其转换为字符串。但是,在这种情况下,您正在传递节点集。在XSLT 1.0中,它将仅将其中的第一个节点转换为字符串,这就是为什么它不使用您的最后一个contains
。 (在XSLT 1.0中,传入由多个节点组成的节点集会引发错误。)
您需要执行此操作,以便将cd
作为条件应用于每个contains
:
test
或者您可以稍微简化一下...
<xsl:value-of select="sum(catalog/cd[artist='Bob Dylan' and extra[not(tests/test[contains(., 'CD')])]]/price)"/>