XPath 1.0: поиск по всем элементам, содержащим - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть XML-документ со следующей структурой:

<books>
  <book>
    <title/>
    <author></author>
    ...
  </book>
</books>

Теперь я хотел бы найти все book автора.Я использую следующее выражение XPath 1.0:

/books/book[contains(author,$value)]

Но это вернет мне только те книги, где автор находится на первом месте (первый авторский элемент книги).

Как мне найти книги, в которых автор не на первом месте?
Я использую XSLT 1.0 в Firefox.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

В XSLT-1.0 нельзя использовать переменную в выражении, соответствующем шаблону.
Это просто не работает, поэтому либо жестко закодируйте значение, либо поместите его в xsl:if или xsl:choose.

То есть

<xsl:template match="/books/book">
    <xsl:if test="contains(author/text(),$value)">
        CONDITION Fulfilled!
    </xsl:if>
</xsl:template>

работает, но использование его в качестве предиката

<xsl:template match="/books/book[contains(author/text(),$value)]">
  CONDITION won't work!
</xsl:template>

не сработает, если вы не закодируете соответствующее ЗНАЧЕНИЕ как

<xsl:template match="/books/book[contains(author/text(),'VALUE')]">
  CONDITION won't work!
</xsl:template>
0 голосов
/ 27 декабря 2018

Этот XPath,

/books/book[author[contains(.,$value)]]

выберет все book элементы с дочерним элементом author, строковое значение которого содержит подстроку , $value.


Этот XPath,

/books/book[author = $value]

выберет все book элементы с дочерним элементом author, строковое значение которого равно $value.

...