我正在进行XSLT转换,我发现了一个我无法回答的有趣问题:
child::*
和child::node()
之间的区别
吗
我想创建一个条件,在其中我将children元素的数量分隔为1,在这种情况下:
<xsl:if test="parent[count(child::*) eq 1])">
vs
<xsl:if test="parent[count(child::node()) eq 1])">
有什么区别?
答案 0 :(得分:6)
要了解XPath中child::*
和child::node()
之间的区别,不仅要了解*
和node()
节点测试之间的差异,还要了解element
和attribute
节点测试之间的差异{3}}轴...
规则:如果某个轴可以包含元素,则其主节点类型为attribute
;否则,它是轴可以包含的节点类型。 (例如,child
轴的主节点类型为element
,因为它只能包含属性。)
child::*
轴可以包含元素,因此子轴的主节点类型为child::node()
。
因此,*
和child
之间的差异是
*
轴上的element
节点测试对所有子元素 成功
上下文节点,因为node()
节点测试成功主节点类型的所有节点(node()
,此处),而child
节点测试成功
上下文节点,因为所有节点类型的child::*
节点测试成功。但请注意,并非所有节点类型都可以位于child::node()
轴上。以下是七种类型的节点以及它们是否可以出现在子轴上:
因此,#include <iostream>
#include <vector>
#include <limits>
#include <chrono>
#include <iomanip>
#include <vector>
#include <algorithm>
struct Data {
double x[SIZE_OF_DATA_ARRAY];
};
double workOnData(Data &data) {
for (auto i = 0; i < 10; ++i) {
data.x[0] -= 0.5 * (data.x[0] - 1);
}
return data.x[0];
}
void runTestSuite() {
auto queries = 1000000;
Data data;
for (auto i = 0; i < queries; ++i) {
data.x[0] = i;
auto val = workOnData(data);
if (val == -357)
data.x[0] = 1;
}
}
int main() {
std::cout << "sizeof(Data) = " << sizeof(Data) << "\n";
size_t numberOfTests = 99;
std::vector<std::chrono::duration<double>> timeMeasurements{numberOfTests};
std::chrono::time_point<std::chrono::system_clock> startTime, endTime;
for (auto i = 0; i < numberOfTests; ++i) {
startTime = std::chrono::system_clock::now();
runTestSuite();
endTime = std::chrono::system_clock::now();
timeMeasurements[i] = endTime - startTime;
}
std::sort(timeMeasurements.begin(), timeMeasurements.end());
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::cout << std::put_time(std::localtime(&now_c), "%F %T")
<< ": median time = " << timeMeasurements[numberOfTests * 0.5].count() << "s\n";
return 0;
}
匹配上下文节点的所有元素子元素,{{1}}匹配所有元素,文本和处理指令子元素上下文节点。
答案 1 :(得分:3)