XSLT:测试节点是否存在,无论它是当前节点的子节点还是子节点



我正在研究一些 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/childparent/*/child元素的并集,并且可能有许多这样的元素。

更糟糕的是

<xsl:apply-templates select="parent/child|parent/*/child"/>        

正如原始问题需要的那样,测试与在与此测试匹配的所有节点上应用模板非常不同。仅测试条件可以显着提高效率。OP 没有以任何方式指示测试以任何方式与应用模板相关联。

相关内容

  • 没有找到相关文章

最新更新