我试图比较这些元素的价值。我可以在策略和组元素下找到角色。如果通过policy元素打印出role,我不想在我通过group元素时再次打印它。而是仅在组元素下打印那些之前尚未由策略元素处理和打印的角色。
这就是我接近它的方式,但不知何故NOT运算符无效并打印出group元素下的所有角色:
<xsl:variable name="roleGroup" select="service/group/name" />
<xsl:variable name="rolePolicy" select="service/group/policy/name" />
<xsl:for-each select="service/group/name">
<xsl:if test="not($roleGroup = $rolePolicy)">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
XML结构:
<service>
<group>
<name>Admins</name>
</group>
<group>
<name>Basic users</name>
</group>
</service>
<service>
<group>
<name>Admins</name>
<policy>
<name>Superusers</name>
</policy>
<policy>
<name>Support</name>
</policy>
</group>
</service>
输出如下:
Group; Role Thru Policy
Admins; Superusers
Admins; Support
Admins;
Basic users;
但我希望这样,没有第二个管理员组:
Group; Role Thru Polic
Admins; Superusers
Admins; Support
Basic users;
因为Admins组已在输出中。
如果有人能告诉我问题在哪里,我感激不尽。感谢。
答案 0 :(得分:0)
你说“如果通过政策要素打印出角色,我不想在我处理群组元素时再次打印它。”
但是你的条件test="not($roleGroup = $rolePolicy)"
仅取决于在循环中声明 的两个变量 - 如果循环的任何迭代都是真的,那么每次迭代都会成立。
由于我看不到您的源XML,我无法告诉您具体情况应该是什么,但我猜是test="not(. = $rolePolicy)"
<强> POSTSCRIPT 强>
坦率地说,我觉得有点令人沮丧,指出你的错误不足以让你修复它。我非常不愿意为那些明显不太懂语言的人编写代码,以便理解代码的工作原理,我强烈建议你在进行更多编码之前需要做更多的阅读。但与此同时,试试这个:
<xsl:variable name="rolePolicy" select="service/group/policy/name" />
<xsl:for-each select="service/group/name[not(. = $rolePolicy)]">
<xsl:value-of select="."/>
</xsl:for-each>