我的 XML 看起来像这样:
<foo>
<bar name="a">
<baz name="xyz">
<time>2</time>
<date>3</date>
</baz>
</bar>
<bar name="b">
<baz name="xyz">
<time>2</time>
<date>3</date>
</baz>
</bar>
<bar name="c">
<baz name="xyz">
<time>2</time>
<date>3</date>
</baz>
</bar>
</foo>
我正在编写一个需要像这样运行的 XSL:如果所有baz
那么孩子们都一样doSomething
else doSomethingElse
。我当前的节点是foo
.
我是 XSLT 新手,并且了解 XSL 中的条件。现在看起来是这样的:
<xsl:template match="foo">
<xsl:choose>
<xsl:when test="[My condition]">
doSomething()
</xsl:when>
<xsl:otherwise>
doSomethingElse()
</xsl:otherwise>
</xsl:choose>
</xsl:template>
在当前示例中,应该doSomething()
正如所有的baz
元素是相同的。
如果我找出唯一的数量baz
元素,我可以测试它是否等于一。如果是的话我会doSomething()
else doSomethingElse()
我应该如何实施这个?什么应该MyCondition
be?
PS:我的XSL版本是1.0
如果所有的baz
那么孩子们都一样doSomething
else
doSomethingElse
。我当前的节点是foo
.
这很令人困惑,因为:
-
baz
不是以下的孩子foo
;
- 你的标题说“查找唯一子项的数量“ - 但事实并非如此
有必要找到它才能知道它们是否相同。
尝试类似的方法:
<xsl:template match="foo">
<xsl:variable name="first-baz" select="(bar/baz)[1]" />
<xsl:choose>
<xsl:when test="bar/baz[date!=$first-baz/date or time!=$first-baz/time]">
<!-- THEY ARE NOT ALL SAME -->
</xsl:when>
<xsl:otherwise>
<!-- THEY ARE ALL SAME -->
</xsl:otherwise>
</xsl:choose>
</xsl:template>
请注意,这假设每个baz
has a date
and a time
。否则你需要测试not(date=$first-baz/date)
etc.
也可以看看:http://www.jeniitennison.com/xslt/grouping/muenchian.html http://www.jenitennison.com/xslt/grouping/muenchian.html
Added:
现在,假设所有bar/baz
元素具有相同的标签(不是
一定date
and time
但是说a
, b
and c
), 会是什么
这种情况下的测试属性?
这使得它变得更加复杂。你仍然可以构建一个密钥:
<xsl:key name="first-baz" match="foo/bar[1]/baz[1]/*" use="name()" />
然后进行测试:
<xsl:when test="bar/baz/*[. != key('first-baz', name())]">
如果有任何孩子,则返回 truebaz
存在其字符串值与作为第一个子节点的同名节点不同的节点baz
.
请注意,此处定义的密钥是文档范围内的。如果您想将测试限制为当前foo
祖先,那么您必须在密钥中包含其 id。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)