XSLT:选择一个节点,其中非子节点具有给定的属性(即 ¬∃ (∄))

XSLT: selecting a node where non of its children do have given properties (i.e. ¬∃ (∄))

提问人:U. Windl 提问时间:9/1/2023 最后编辑:U. Windl 更新时间:9/4/2023 访问量:50

问:

我认为重复 XSLT 中的所有代码会适得其反: 当缺少特定的内部子元素时,如何跳过元素? 当问另一个问题时:

在所示示例中,有一些元素填充了来自每个 (valid) 的数据。 但是,如果根本没有有效的样本,则不会创建任何内容。 有效样本的条件为 。resultsample[@label and value]

我正在寻找的是匹配条件,如果没有匹配;“¬∃”可以这么说。 例如,这种匹配可用于创建错误输出。<xsl:template match="perf_data/sample[@label and value]">

基本的 XSL 模式似乎是“如果存在,那么所有匹配都做......”,但我需要“如果不存在,那么做......一次”。

我以为解决方案类似于 ,但这并没有按预期工作。<xsl:template match="[not(boolean(./sample/@label) or not(./sample/value))]">

那么有可能吗,如果可能,如何? 我花了相当长的时间来寻找这样的解决方案,但失败了......

正在使用的软件来自;我不知道它支持哪个版本的 XSLT。 它说:xsltproclibxslt-tools-1.1.28

Using libxml 20904, libxslt 10128 and libexslt 817
xsltproc was compiled against libxml 20901, libxslt 10128 and libexslt 817
libxslt 10128 was compiled against libxml 20901
libexslt 817 was compiled against libxml 20901
XPath XSLT 匹配

评论

0赞 michael.hor257k 9/1/2023
看看我对你的另一个问题的回答中的第一个模板:stackoverflow.com/a/77015187/3016153。请注意,无法使用与输入中的任何内容不匹配的模板创建输出。您必须在与某个祖先节点匹配的模板中执行此操作。
0赞 U. Windl 9/1/2023
也许这令人困惑:我编辑了这个问题,指出我试图为 ,而不是 。perf_datasample
0赞 michael.hor257k 9/1/2023
这是一个例子。它演示了如何将模板应用于一组节点,或者在集合为空时输出错误合并消息。P.S. 如果你想把你的问题说清楚,那就包括一个最小的可重复的例子,而不是要求我们在页面之间来回切换。
1赞 Michael Kay 9/2/2023
您没有说出您使用的是哪个 XSLT 版本。在 XSLT 3.0 中,有一个指令似乎适合您的需要。xsl:on-empty
0赞 michael.hor257k 9/4/2023
libxslt支持 XSLT 1.0(+ 多个 EXSLT 功能)。

答:

1赞 Martin Honnen 9/1/2023 #1

您可以做例如

<xsl:template match="perf_data[not(sample[value|@label])]">error message: not a single sample with a value or label</xsl:template>

评论

0赞 U. Windl 9/4/2023
我试过了,但没有用。另外:不是说“有子属性的 a”吗?然而,这应该是相反。sample[value|@label]samplevaluelabel