Как использовать функцию XPath contains () в document.evaluate ()? - PullRequest
1 голос
/ 19 декабря 2011

У меня есть этот раздел кода, который я использовал для фильтрации полей на основе искомого имени. Проблема в том, что мне нужно немного прощать с точки зрения того, что пользователь может печатать. Поэтому я должен использовать функцию contains. Я работал с другими фрагментами кода, но не уверен, как я могу использовать его со следующим:

var value = stylesheet.evaluate(
                               "//xsl:for-each[@select='book[author="contains(.,'containsSearchTerm')"']",
                               stylesheet, nsResolver,
                               XPathResult.ANY_UNORDERED_NODE_TYPE, null);

Извините, если кавычки / экранирование немного запутались. У меня нет открытой IDE для проверки моих ошибок, и я готовлюсь к работе.

Так что я могу взять значение формы и обработать его с помощью функции contains. Как это достигается?

Обратите внимание, что я довольно новичок в XML, XSLT и XPath в целом, поэтому, если это вообще возможно, потребуется небольшое упрощение.


Ответ Майклу Кей -

Привет, я пытаюсь применить искомый термин / слово к полю авторов в таблице XSLT. Да, вы правы, это то, что я пытаюсь сделать. Отредактируйте таблицу стилей и примените набор условий в форме ввода. До сих пор я использовал готовую функцию. Модификация по мере необходимости. Я могу заставить содержимое работать внешне, если жестко запрограммировать значение для ввода, которое нужно найти. Однако я хочу сделать это «на лету», и на самом деле просто не уверен, как заставить это работать в контексте, к которому я стремлюсь. На самом деле у меня есть запрос, который строится внутри формы - указывается поле для поиска, операнд и поисковый запрос. Но я не хочу искать целые строки, потому что это немного негибко - поэтому я хотел использовать функцию contains, чтобы обеспечить гибкость поиска.

Спасибо за помощь

Ответы [ 3 ]

1 голос
/ 19 декабря 2011

Поскольку вы новичок в XML и XSLT, было бы неплохо подтвердить, что вы не идете сюда по кроличьей норе.Вы используете XPath для поиска таблицы стилей XSLT.Это довольно продвинутая / амбициозная вещь, и было бы неплохо знать, что это имеет смысл в контексте вашего приложения.Так какую проблему вы пытаетесь решить?

Что касается деталей, мне нужно угадать ваше намерение путем обратного проектирования синтаксически-некорректного кода, что всегда сложно.Я предполагаю, что вы, вероятно, ищете инструкцию xsl: for-each, у которой атрибут select имеет общую форму

book [author = ....]

, и вы хотите установить некоторые ограниченияо том, что "....", но кроме этого я не могу сказать, что вы делаете.Кроме того, если вы хотите быть «прощающим», то вы, вероятно, хотите разрешить пробелы в местах, где могут появляться пробелы, и т. Д. Возможно, совпадение с регулярным выражением удовлетворит ваши потребности (регулярные выражения доступны в XPath 2.0), ноЯ действительно не могу сказать.

0 голосов
/ 21 декабря 2011

Часто вы можете достичь желаемого, используя параметры таблицы стилей: ищите xsl: param.Если вы хотите предоставить в качестве параметра больше, чем просто значение для поиска (например, если количество условий поиска является переменным), то иногда лучшим решением является вызов xx :valu () - многие процессоры XSLT имеют расширение, которое позволяетВыражение XPath предоставляется в виде строки для динамического построения и оценки.Наконец, изменение таблицы стилей перед выполнением - вариант: не самый простой, но иногда правильный ответ.Самый простой и гибкий способ найти элемент, который вы хотите изменить, - дать ему атрибут xml: id:

<xsl:for-each select="...." xml:id="point-of-change">
  ...
</xsl:for-each>
0 голосов
/ 19 декабря 2011

Если таблица стилей XSLT, по которой вы хотите оценить выражение XPath, содержит этот фрагмент :

   <xsl:for-each select=
    "book[contains(author, ZZZZZ)]">

     <!-- Code here. -->
    </xsl:for-each>

Тогда одно выражение XPath, которое выбирает этот xsl:for-each элемент (и может выбрать другие такие элементы, если они существуют):

//xsl:for-each
      [
       @select = 'book[contains(author, ZZZZZ)]'
      ]

Проверка на основе XSLT :

При следующем преобразовании:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "//xsl:for-each
      [@select = 'book[contains(author, ZZZZZ)]'
      ]
  "/>
 </xsl:template>
</xsl:stylesheet>

применяется к этому документу XML :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
   <xsl:for-each select=
    "book[contains(author, ZZZZZ)]">

     <!-- Code here. -->
    </xsl:for-each>
 </xsl:template>

</xsl:stylesheet>

он выбирает нужный элемент и выводит его в результате :

<xsl:for-each xmlns:xsl="http://www.w3.org/1999/XSL/Transform" select="book[contains(author, ZZZZZ)]">

     <!-- Code here. -->
    </xsl:for-each>
...