如何检查字符串是否包含在列表中?

时间:2018-11-07 06:44:24

标签: xslt xpath

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))]

我一直在抓稻草,所以我很乐意让别人启发我。预先感谢!

1 个答案:

答案 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)"/>