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

时间:2011-05-11 18:23:44

标签: xslt xpath xslt-1.0

我正在进行一些xslt转换,我刚刚发现在我当前的父级和它的clildren之间可能存在或者可能没有额外的节点,具体取决于外部因素。所以现在我必须更改我的xslt代码以处理这两种情况:

方案1:

<parent>
   <child/>
   <child/>
<parent>

方案2:

<parent>
   <nuisance>
      <child/>
      <child/>
   </nuisance>
<parent>

我遇到I 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>

但是这会使我的代码大小增加三倍,而且需要大量的手工劳动......

非常感谢!

2 个答案:

答案 0 :(得分:5)

为什么不简单地选择两者的结合?

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

这将在两种情况下选择正确的节点。

答案 1 :(得分:0)

  

我有情况我   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没有以任何方式表明测试与应用模板有任何关联。