Во-первых, будьте осторожны с вашей терминологией. В вашем XML только category
и lang
являются атрибутами. С другой стороны author
это элемент. Итак, вы действительно спрашиваете, как сопоставить, когда несколько дочерних элементов имеют одно и то же имя.
Ответ заключается в том, чтобы сделать именно то, что вы пытаетесь сделать, ожидайте, что вам просто нужно указать имя автора в апострофах, чтобы указать, что это строковый литерал
<xsl:value-of select="/bookstore/book[author = 'James McGovern']/title"/>
Если у вас есть выражение типа author = 'James McGovern'
, оно на самом деле проверит все элементы author
и вернет true, если хотя бы одно совпадение. Таким образом, он все равно вернет истину, даже если «Джеймс Макговерн» является последним перечисленным автором.
(Если вы хотите узнать больше, вы можете прочитать о логических выражениях в официальной спецификации W3C по адресу https://www.w3.org/TR/xpath-10/#booleans. В частности, этот случай покрыт строкой " Если сравнивается один объект является набором узлов, а другой является строкой, тогда сравнение будет истинным в том и только в том случае, если в наборе узлов есть узел, так что результат выполнения сравнения со строковым значением узла и другого строка верна")