XSLT - 检查XML文件中是否存在子元素属性

时间:2015-03-30 13:07:30

标签: xml xslt

假设我在xml文件中有以下内容:

<student name="bob">
    <grades exam1="98" exam2="53"/>
    <status>GOOD</status>
</student>

在我的xslt中我有类似的东西:

<xsl:choose>
    <xsl:when test="(student/status[text()='GOOD']) and not(student/grades/@exam1)">
        <!--passed code here-->
    </xsl:when>
    <xsl:otherwise>
        <!--otherwise code here-->
</xsl:choose>

现在有条件的第一部分工作(即检查状态是否良好)但第二部分没有(即检查学生是否没有考试成绩1)所以进入&#34;在这里传递代码&#34;我只想看看那些有以下内容的学生:

<student name="mary">
    <grades exam2="53"/>
    <status>GOOD</status>
</student>

所以成绩下没有exam1属性。我真的不知道我在上面给出的条件陈述中做错了什么。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

使用以下文件:

<root>
    <student name="bob">
        <grades exam1="98" exam2="53"/>
        <status>GOOD</status>
    </student>
    <student name="mary">
        <grades exam2="53"/>
        <status>GOOD</status>
    </student>
</root>

这两个模板将匹配其中一个。这比在整个地方使用xsl:choose更好。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

    <xsl:template match="/root/student[status='GOOD' and grades/@exam1]">
      asdf      
    </xsl:template>

    <xsl:template match="/root/student[status='GOOD' and not(grades/@exam1)]">
      fdsa
    </xsl:template>
</xsl:transform>

这导致:

asdf

fdsa