Как проверить, содержится ли строка в списке? - PullRequest
0 голосов
/ 07 ноября 2018

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 я хочу взять сумму всех исполнителей, таких как Боб Дилан, и хочу убедиться, что я получаю только те тесты, которые не содержат 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 голосов
/ 07 ноября 2018

В вашем оригинальном XSLT это есть в вашем выражении ...

extra[not(contains(tests/test,'CD'))]

contains - это строковая функция, которая принимает 2 строки в качестве аргументов. Если вы передадите ему узел, он сначала преобразует его в строку. Однако в этом случае вы передаете набор узлов. В XSLT 1.0 он преобразует только первый узел в этой строке, поэтому он не берет ваш последний cd. (В XSLT 1.0 передача набора узлов, состоящего из более чем одного узла, приводит к ошибке).

Вам нужно сделать это, чтобы contains применялся как условие к каждому test:

<xsl:value-of select="sum(catalog/cd[artist='Bob Dylan' and extra[not(tests/test[contains(., 'CD')])]]/price)"/>

Или вы могли бы немного упростить это до этого ...

<xsl:value-of select="sum(catalog/cd[artist='Bob Dylan' and not(extra/tests/test[contains(., 'CD')])]/price)"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...