微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml – XSLT:如何检查一个父节点中的某些节点是否相等

我试图想一个XSL片段,它会检查一个班级是否所有学生都有相同的姓氏.是的,那么(做任何事情)打印“所有的姓氏都是相同的”否则打印“所有的姓氏都不一样”.

什么打印真的没关系.我只是想为它找到合适的逻辑.

这是我的示例XML

<root>
    <class name="Physics">
        <student>
            <firstname>John</firstname>
            <lastname>Doe</lastname>
            <age>21</age>
        </student>
        <student>
            <firstname>Mary</firstname>
            <lastname>Doe</lastname>
            <age>21</age>
        </student>
        <student>
            <firstname>Ralph</firstname>
            <lastname>Doe</lastname>
            <age>21</age>
        </student>
    </class>
    <class name="Math">
        <student>
            <firstname>John</firstname>
            <lastname>Doe</lastname>
            <age>21</age>
        </student>
        <student>
            <firstname>Mary</firstname>
            <lastname>Doe</lastname>
            <age>21</age>
        </student>
        <student>
            <firstname>Tee</firstname>
            <lastname>Rex</lastname>
            <age>21</age>
        </student>
    </class>
</root>

因此,对于Physics类,它将打印“所有姓氏都相同”.
对于数学课,它会打印“所有姓氏都不一样”.

(这不是我真正的XML,因为它对于一个较小的问题是不可简化的,所以我自定义使用这个XML代表我的问题)

任何帮助将不胜感激.

问候,
Shobhit

解决方法

嗯.对此问题一无所知,我会这样做:

<xsl:template match="class">
  <xsl:choose>
    <xsl:when test="
      count(student[not(lastname = preceding-sibling::student/lastname)]) = 1
    ">
      <xsl:text>all lastnames are same</xsl:text>
    <xsl:when>
    <xsl:otherwise>
      <xsl:text>all lastnames are not same</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

XPath表达式

student[not(lastname = preceding-sibling::student/lastname)]

选择所有< student>节点的< lastname>与同一类中任何前面的姓氏不同.

在具有所有相同姓氏的类中,它们的计数正好为1(因为第一个学生总是有一个不同于任何前一个姓氏的姓氏).如果计数高于1,则该类中的一些学生具有不同的姓氏.

一个班级根本没有学生的情况将被识别为< xsl:否则>在上面的逻辑中的情况.您可能希望以某种方式明确处理该情况.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。