Два способа сделать это. Либо включите «my» пространство имен в тег таблицы стилей, как это:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="(insertnamespacehere)">
и do
<xsl:template match="my:account/my:name/text()"
>
или сделайте довольно неуклюже:
<xsl:template match="*[local-name()='account']/*[local-name()='name']/text()">
Я бы склонен препятствовать последнему подходу, хотя существуют пространства имен, чтобы различать элементы, имеющие одно и то же локальное имя (например, например, employee:name
и company:name
), используя local-name()
, вы игнорируете это различие. Другими словами, если ваш документ содержит foo:account/foo:name
, вы также случайно замените его.
Кстати, ваш последний образец XML недействителен - пространство имен my
не объявлено. Ваш корень my:accounts
должен будет включить это с помощью <my:accounts xlmns:my="(insertnamespacehere)">
Текущие браузеры имеют Массив # включает
, что делает ровно , что широко поддерживается , и имеет polyfill для старых браузеров.
> ['joe', 'jane', 'mary'].includes('jane');
true
Вы также можете использовать Array # indexOf
, который менее прямой, но не требует полифиллов для устаревших браузеров.
jQuery предлагает $ .inArray
, который функционально эквивалентен Array # indexOf
.
underscore.js , служебной библиотеке JavaScript,
indexOf
, возможно, но это - "расширение JavaScript стандарта ECMA-262; как таковой это не может присутствовать в других реализациях стандарта".
Пример:
[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1
AFAICS Microsoft делает не , предлагают некоторую альтернативу этому, но можно добавить схожую функциональность к массивам в Internet Explorer (и другие браузеры, которые не поддерживают indexOf
), если Вы хотите, как , быстрый поиск Google показывает (например, этот ).
Обновление с 2019: Этот ответ с 2008 (11 лет!) и не важно для современного использования JS. Обещанное повышение производительности было основано на сравнительном тесте, сделанном в браузерах того времени. Это не могло бы относиться к современным контекстам выполнения JS. Если Вы нуждаетесь в легком решении, ищете другие ответы. Если Вы нуждаетесь в лучшей производительности, сравниваете для себя в соответствующих средах выполнения.
, Поскольку другие сказали, повторение через массив является, вероятно, лучшим способом, но это было доказано , которого уменьшение while
цикл является самым быстрым способом выполнить итерации в JavaScript. Таким образом, можно хотеть переписать код следующим образом:
function contains(a, obj) {
var i = a.length;
while (i--) {
if (a[i] === obj) {
return true;
}
}
return false;
}
, Конечно, можно также расширить прототип Массива:
Array.prototype.contains = function(obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;
}
И теперь можно просто использовать следующее:
alert([1, 2, 3].contains(2)); // => true
alert([1, 2, 3].contains('2')); // => false
При использовании JavaScript 1.6 или позже (Firefox 1.5, или позже) можно использовать Array.indexOf. Иначе я думаю, что Вы собираетесь закончить с чем-то подобным Вашему исходному коду.
Вот JavaScript 1.6, совместимый реализация Array.indexOf
:
if (!Array.indexOf) {
Array.indexOf = [].indexOf ?
function(arr, obj, from) {
return arr.indexOf(obj, from);
} :
function(arr, obj, from) { // (for IE6)
var l = arr.length,
i = from ? parseInt((1 * from) + (from < 0 ? l : 0), 10) : 0;
i = i < 0 ? 0 : i;
for (; i < l; i++) {
if (i in arr && arr[i] === obj) {
return i;
}
}
return -1;
};
}
Вот как Prototype это делает :
/**
* Array#indexOf(item[, offset = 0]) -> Number
* - item (?): A value that may or may not be in the array.
* - offset (Number): The number of initial items to skip before beginning the
* search.
*
* Returns the position of the first occurrence of `item` within the array — or
* `-1` if `item` doesn't exist in the array.
**/
function indexOf(item, i) {
i || (i = 0);
var length = this.length;
if (i < 0) i = length + i;
for (; i < length; i++)
if (this[i] === item) return i;
return -1;
}
Также см. здесь , чтобы узнать, как они его подключают.
Расширение объекта JavaScript Array
- действительно плохая идея, потому что вы вводите новые свойства (свои собственные методы) в циклы for-in
, которые могут нарушить существующие скрипты. Несколько лет назад авторам библиотеки Prototype пришлось перепроектировать реализацию своей библиотеки, чтобы удалить именно такие вещи.
Если вам не нужно беспокоиться о совместимости с другим JavaScript, работающим на свою страницу, дерзайте, иначе я бы порекомендовал более неудобное, но более безопасное автономное функциональное решение.
Размышляя на секунду, если вы делаете этот вызов много раз, гораздо эффективнее использовать ассоциативный массив карту для выполнения поиска с помощью хэш-функции.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
Еще один вариант
// usage: if ( ['a','b','c','d'].contains('b') ) { ... }
Array.prototype.contains = function(value){
for (var key in this)
if (this[key] === value) return true;
return false;
}
Будьте осторожны, потому что перегрузка объектов массива javascript пользовательскими методами может нарушить поведение других javascript, вызывая неожиданное поведение.