Xml XSLT1.0:根据优先级只匹配两个模板中的一个
XSL: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: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'执行某些操作
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>