我正在研究一些 xslt 转换,我刚刚发现在我当前的父节点和它的 clildren 之间可能有也可能没有额外的节点,这取决于外部因素。所以现在我必须更改我的 xslt 代码才能处理这两种情况:
场景 1:
<parent>
<child/>
<child/>
<parent>
场景 2:
<parent>
<nuisance>
<child/>
<child/>
</nuisance>
<parent>
我遇到test="parent/child"
或以其他方式使用这种格式访问父节点/节点的情况。
我需要类似test="parent/magic(* or none)/child"
他们所知道的唯一可以解决这个问题的方法就是使用:
<xsl:choose>
<xsl:when test="parent/child">
<!-- select="parent/child"-->
</xsl:when>
<xsl:otherwise>
<!-- select="parent/*/child"-->
</xsl:otherwise>
</xsl:choose>
但这会使我的代码大小增加三倍,并且会是大量的体力劳动......
非常感谢帮助!
为什么不简单地选择两者的并集呢?
<xsl:apply-templates select="parent/child|parent/*/child"/>
这将在这两种情况下选择正确的节点。
我有我的情况
test="parent/child"
或以其他方式使用 这种访问 父/节点。我需要类似的东西
test="parent/magic(* or none)/child"
此表达式可能更快:
parent/child or parent/*/child
比表达式:
parent/child|parent/*/child
几乎任何 XPath 引擎都会在第一次出现parent/child
或第一次出现parent/someElement/child
时立即停止评估
另一方面,第二个表达式选择所有parent/child
和parent/*/child
元素的并集,并且可能有许多这样的元素。
更糟糕的是:
<xsl:apply-templates select="parent/child|parent/*/child"/>
正如原始问题需要的那样,测试与在与此测试匹配的所有节点上应用模板非常不同。仅测试条件可以显着提高效率。OP 没有以任何方式指示测试以任何方式与应用模板相关联。