我想提取元素结束标记之前的文本节点a
。例如,对于此示例 XML:
<root>
<a/>
<a>1</a>
<a>2<b/>3</a>
<a>4<b/></a>
<a><b/>5<c/></a>
</root>
预期结果将是序列( 1, 3 )
该表达式//a/text()[last()]
是不够的,因为它返回( 1, 3, 4, 5 )
,问题是我不知道如何添加约束:“就在”的结束标记之前a
。
我想提取元素结束标记之前的文本节点a
。例如,对于此示例 XML:
<root>
<a/>
<a>1</a>
<a>2<b/>3</a>
<a>4<b/></a>
<a><b/>5<c/></a>
</root>
预期结果将是序列( 1, 3 )
该表达式//a/text()[last()]
是不够的,因为它返回( 1, 3, 4, 5 )
,问题是我不知道如何添加约束:“就在”的结束标记之前a
。
给出简化的输入:
[
[ "gpu" ],
[ "disk" ]
]
我想选择第一个元素为的数组"gpu"
。
我可以用一个简单的条件来做到这一点:
map(select(.[0] == "gpu"))
[
[ "gpu" ]
]
但是我不明白当我尝试使用IN
内置函数时出了什么问题:
map(select(.[0] | IN(["gpu"])))
[]
我用的是jq
1.6
我有一个 XML 文件:
<books>
<title>Moby-Dick</title>
<author>Herman Melville</author>
<title>Sunrise Nights</title>
<author>Jeff Zentner</author>
<author>Brittany Cavallaro</author>
<price>14.52€</price>
<title>My Salty Mary</title>
<author>Cynthia Hand</author>
<author>Brodi Ashton</author>
<author>Jodi Meadows</author>
</books>
我想将其转换为:
<books>
<book>
<title>Moby-Dick</title>
<author>Herman Melville</author>
</book>
<book>
<title>Sunrise Nights</title>
<author>Jeff Zentner</author>
<author>Brittany Cavallaro</author>
<price>14.52€</price>
</book>
<book>
<title>My Salty Mary</title>
<author>Cynthia Hand</author>
<author>Brodi Ashton</author>
<author>Jodi Meadows</author>
</book>
</books>
逻辑是,book
每次我们遇到一个时就创建一个新的title
,并将每个后续的“非标题”节点放入该书中。
以下是我迄今为止尝试过的:
let $books := (
doc("books.xml")/books/* =>
fold-left((array{}, 0), function($acc, $node) {
let
$arr := $acc[1],
$idx := $acc[2]
return
if (name($node) = "title")
then ($arr => array:append($node), $idx+1)
else ($arr => array:put($idx, ($arr($idx), $node)), $idx)
})
)[1]
return
<books>{
for $book in $books
return <book>{$book}</book>
}</books>
但我明白
<books>
<book>
<title>Moby-Dick</title>
<author>Herman Melville</author>
<title>Sunrise Nights</title>
<author>Jeff Zentner</author>
<author>Brittany Cavallaro</author>
<price>14.52€</price>
<title>My Salty Mary</title>
<author>Cynthia Hand</author>
<author>Brodi Ashton</author>
<author>Jodi Meadows</author>
</book>
</books>
旁白: group by
这似乎对解决当前问题没有用,所以我尝试将书籍分组到一个数组中,但我不知道这是否是正确的方法;欢迎任何建议。
我正在尝试使用 Vanilla 自定义元素,但似乎无法插入样式标签:
class MyElement extends HTMLElement {
constructor() {
super();
this.attachShadow({mode: "open"});
}
connectedCallback() {
this.shadowRoot.append(document.getElementById('my-element-template').content.cloneNode(true));
}
}
window.customElements.define("my-element", MyElement);
<template id="my-element-template">
<slot name="my-style">
<style>
p { color: red; }
</style>
</slot>
<p>Why am I still red instead of green?</p>
</template>
<my-element>
<style slot="my-style">
p { color: green; }
</style>
</my-element>
我正在尝试<select>
用现有表单中的 Select2 替换标准。表单逻辑是用 Vanilla JS 编写的,客户端验证留给浏览器。
问题是当我使用 Select2 组件时浏览器生成的错误消息的位置:
document.querySelectorAll("[data-is=select2]").forEach(el => {
// the Select2 component only works with JQuery objects
let $jqo = $(el);
$jqo.select2({
width: "auto",
placeholder: el.firstElementChild.textContent
});
// making sure select2 works with the existing handlers
$jqo.on("select2:select", ev => el.dispatchEvent(new Event("change")));
});
form {
width: 20rem;
}
label {
display: flex;
align-items: center;
column-gap: 1ch;
}
/* making select and Select2 occupy the remaining space */
select, .select2-container {
flex-grow: 1;
}
<script src="https://code.jquery.com/jquery-3.7.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/select2.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/select2.min.css" rel="stylesheet" />
<!-- Standard select example --!>
<form>
<p>
<label>
Greetings:
<select name="greetings" required>
<option hidden disabled value="" selected>Select a Greetings</option>
</select>
</label>
<p>
<input type="submit" value="Standard select">
</form>
<hr>
<!-- Standard select replaced with a Select2 component !-->
<form>
<p>
<label>
Greetings:
<select data-is="select2" name="greetings" required>
<option hidden disabled value="" selected>Select2 a Greetings</option>
</select>
</label>
<p>
<input type="submit" value="Select2 select">
</form>
如您所见,单击按钮后,Select2 的验证消息被放置在<label>
而不是 下方<select>
。
我该如何修复它?最好不使用 JQuery。
script
我无法使用Vanilla JavaScript解析标签中嵌入的 XML 文档:
document.addEventListener('DOMContentLoaded', function() {
const xmlStr = document.getElementById('xml').innerText;
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlStr,'text/xml');
const barText = xmlDoc.getElementById('bar').textContent;
alert(barText)
});
<body>
<h1>Parsing <script type="text/xml"> with JavaScript</h1>
<script id="xml" type="text/xml">
<?xml version="1.0" encoding="utf-8"?>
<foo>
<bar id="bar">Hello world!</bar>
</foo>
</script>
</body>
这里有什么问题?
我在节点中有一些文本,例如:
<xml><Hello world "&" foo bar></xml>
我想string(/xml)
对其进行处理和 JSON 转义,以便结果类似于:
"<Hello world \"&\" foo bar>"
我怎样才能用 XPath 3.1 做到这一点?
是否有一个函数可以测试(或返回) 的类型.
?例如:
( root(), (), "a", 1, map{}, array{} ) ! unknown:type-of(.)
node
sequence
string
number
map
array
假设您有一个文件,其中包含 N 个以空格分隔的列和一个附加列,其中包含您想要保留的空格。
N = 2 的示例:
1.1 1.2 data for row1
2.1 2.2 data for row2
? ? data for row3
\ * data for row4
我想输出:
data for row1
data for row2
data for row3
data for row4
在 shell 中,您可以使用以下命令轻松完成此操作:
while read -r _ _ data
do
printf "%s\n" "$data"
done < data.txt
但awk
这样做有点困难。有没有一种方法awk
可以只拆分前 N 列?
我有一组对:
inputs = {
('id1', 'id2'), ('id1', 'id3'), ('id1', 'id4'),
('id2', 'id3'), ('id2', 'id4'),
('id3', 'id4'), ('id3', 'id5'),
('id4', 'id5'),
('id5', 'id6'),
}
我想反转 2 阶的组合,如下所示:
recombinations = [
('id1', 'id2', 'id3', 'id4'),
('id3', 'id4', 'id5'),
('id5', 'id6'),
]
我设法使用暴力来做到这一点:
ids = list(sorted( {i for i in itertools.chain(*inputs)} ))
excludes = set()
recombinations = {tuple(i) for i in map(sorted, inputs)}
for i in range(3, len(ids)+1):
for subset in itertools.combinations(ids, i):
for j in range(i-1, len(subset)):
combs = set(itertools.combinations(subset, j))
if all(tup in recombinations for tup in combs):
recombinations.add(subset)
excludes = excludes.union(combs)
for tup in excludes:
recombinations.remove(tup)
print(recombinations)
{('id1', 'id2', 'id3', 'id4'), ('id3', 'id4', 'id5'), ('id5', 'id6')}
我的问题是:是否有更智能的方法来做到这一点,或者我可以在代码中实现一些优化?
我有一个包含可变数量字典的列表,例如:
var = [ {'a': 1, 'b': 2}, {'b': 20, 'a': 10, 'c': 30}, {'c': 300, 'a': 100} ]
我需要提取所有字典共有的键,列出它们的关联值,从中创建一个新字典,并将其存储在同一个变量中:
预期结果是:
var = { 'a': [1, 10, 100] }
我可以找到键的交集:
[k for k in var[0] if all(k in d for d in var[1:])]
但是如何完成其余的转换呢?
我的一位同事想要运行一个 FORTRAN 程序,该程序接受文件参数并根据一些模糊的生物物理化学标准输出它们的顺序(最好是第一个)。他需要的是最好的10个结果。
虽然文件不大,但问题是他有一个bash: /home/progs/bin/ardock: Argument list too long
,所以我创建了文件的 6 位长符号链接并将它们作为参数,这有效;-)
现在,如果文件数量确实太大,上述技巧无法发挥作用,那么您可以采取什么措施来从所有文件中获得 10 个最好的文件呢?您是否必须按块对文件进行排序,并使用类似的方法将最好的与最好的进行比较?
#!/bin/bash
best10() { ardock "$@" | head -n 10; }
export -f best10
find . -name '*.dat' -exec bash -c 'best10 "$@"' _ {} + |
xargs bash -c 'best10 "$@"' _ |
xargs bash -c 'best10 "$@"' _ |
xargs bash -c ... | ... | ...
这里的问题是,需要的数量xargs
是事先不知道的,那么如何使其成为一个循环呢?