Xml XSLT1.0:根据优先级只匹配两个模板中的一个

Xml XSLT1.0:根据优先级只匹配两个模板中的一个,xml,templates,xslt,xslt-1.0,operator-precedence,Xml,Templates,Xslt,Xslt 1.0,Operator Precedence,XSL: 例如: <xsl:template match="/"> <xsl:apply-templates select="*[local-name(.)='root']/*[local-name(.)='child1']" /> <xsl:apply-templates select="*[local-name(.)='root']/*[local-name(.)='child2']/*[local-name()='anotherchild

XSL:


例如:

<xsl:template match="/">
    <xsl:apply-templates select="*[local-name(.)='root']/*[local-name(.)='child1']" /> 
    <xsl:apply-templates select="*[local-name(.)='root']/*[local-name(.)='child2']/*[local-name()='anotherchild1']" /> 
</xsl:template>

<xsl:template match="*[local-name(.)='child1']">
     <!-- do something in template1 !-->
</xsl:template>

<xsl:template match="*[local-name(.)='anotherchild1']" priority="0">
    <!-- do something in template2 !-->
</xsl:template>

要求:

  • 如果只有“child1”在场,我想和“child1的孙子”做点什么
  • 如果只有“另一个孩子1”在场,我想和“另一个孩子的孙子1”做点什么
  • 如果存在'child1'和'anotherchild1',我只希望'child1'模板优先,并对'孙子1'执行某些操作
上面的XSL为我提供了#1和#2的预期结果,但如果两者都存在,则两个模板都将匹配,并呈现两个结果。我怎样才能只取第一个呢

如果只有“child1”在场,我想做点什么 “孩子的孙子”

下面是一个模板示例,仅当其父级
child1
没有兄弟姐妹时,该模板才匹配
child1的孙子:

<a:root>
   <b:child1>
     <d:grandchildOfChild1>
     </d:grandchildOfChild1>
   </b:child1>
   <c:child2>
     <d:anotherchild1>
       <d:grandchildOfAnotherChild1>
       </d:grandchildOfAnotherChild1>
     </d:anotherchild1>
   </c:child2>
</a:root>

你可以为你的第二个要求做同样的事情


如果“child1”和“另一个child1”存在,我只想要“child1” 模板优先并使用它做一些事情 “孩子的孙子1”

这部分不清楚。我想您需要另一个模板:

<xsl:template match="child1[count(../*) = 1]/grandchildOfChild1">
    <!-- do something with 'grandchildOfChild1' -->
</xsl:template>


每当上述更具体的模板不适用时,这将起作用。

对我来说,这个问题一点也不清楚。我可以看到您输入的所有元素,但您的解释是“有条件的”它们的存在。我想在解决这个问题之前要做的是学习如何正确使用名称空间。这里有几十个答案,说明了如何做到这一点。我也同意你的问题完全不清楚。请给我们一个真实的例子和所需的输出。谢谢!我的#3要求是,当传入的XML文档中存在两个元素时,仅在第一个模板上进行匹配。例如,如果存在“child1”和“anotherchild1”,我希望匹配“child1”的模板优先,并且只匹配。应忽略与“anotherchld1”匹配的模板。希望这是清楚的……不,恐怕一点也不清楚。您可以让多个模板与
child1
匹配,并指定确定何时应用哪个模板的条件。您不能让模板匹配
child1
覆盖模板匹配
另一个child1
<xsl:template match="grandchildOfChild1">
    <!-- do something else with 'grandchildOfChild1' -->
</xsl:template>