如何选择具有多个子元素的元素,所有子元素的属性都不等于特定值

时间:2014-02-12 05:36:45

标签: xml xslt xpath

我有这个xml:

 
<Audit>
    <Clsinfo>

        <Class Discipline="BUSA" Number="7" Credits="4" Letter_grade="A" Id_num="0043">
            <Attribute Code="DWSISKEY" Value="1-1-1"/>
            <Attribute Code="ATTRIBUTE" Value="CSB4"/>
            <Attribute Code="ATTRIBUTE" Value="N"/>
        </Class>

        <Class Discipline="BUSA" Number="72" Credits="5" Letter_grade="A" Id_num="0025">
            <Attribute Code="DWSISKEY" Value="21173"/>
            <Attribute Code="ATTRIBUTE" Value="CSB4"/>
            <Attribute Code="ATTRIBUTE" Value="N"/>
        </Class>

        <Class Discipline="BSKI" Number="8" Credits="4" Letter_grade="A" Id_num="0051">
            <Attribute Code="DWSISKEY" Value="1-1-2"/>
            <Attribute Code="ATTRIBUTE" Value="P"/>
        </Class>

        <Class Discipline="CHIN" Number="1" Credits="4" Letter_grade="A" Id_num="0019">
            <Attribute Code="DWSISKEY" Value="72800"/>
            <Attribute Code="ATTRIBUTE" Value="AAC2"/>
            <Attribute Code="ATTRIBUTE" Value="ASC2"/>
            <Attribute Code="ATTRIBUTE" Value="CSC2"/>
            <Attribute Code="ATTRIBUTE" Value="IG6A"/>
            <Attribute Code="ATTRIBUTE" Value="N"/>
        </Class>

    </Clsinfo>

    <Fallthrough Classes="4" Credits="21" Noncourses="0">
        <Class Discipline="BUSA" Number="72" Credits="5" Letter_grade="A" Id_num="0025"/>
        <Class Discipline="BSKI" Number="8" Credits="4" Letter_grade="P" Id_num="0051"/>
        <Class Discipline="CHIN" Number="1" Credits="4" Letter_grade="A" Id_num="0019"/>
    </Fallthrough>
</Audit>

我想将Fallthrough类分为两组,分别称为Basic Skills and Others。 Basic Skills组在Fallthrough中具有通过Id_num链接到Class Element的类,并且链接的Class元素的一个属性具有值“P”。否则,如果链接的Class元素的任何属性都没有值“P”,它将显示在Others组中。

所以,使用我的xml,我希望得到这个输出:

基本技能

BSKI 8

其他

BUSA 72 CHIN 1

如果有人能帮助我,我会非常感激。

谢谢, 安迪

2 个答案:

答案 0 :(得分:0)

尝试类似:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" />

<xsl:key name="ftclass" match="Fallthrough/Class" use="@Id_num" />

<xsl:template match="/">
    <xsl:text>Basic Skills:&#10;</xsl:text>
    <xsl:apply-templates select="Audit/Clsinfo/Class[key('ftclass', @Id_num)/@Letter_grade='P']" />
    <xsl:text>&#10;Others:&#10;</xsl:text>
    <xsl:apply-templates select="Audit/Clsinfo/Class[not(key('ftclass', @Id_num)/@Letter_grade='P')]" />
</xsl:template>

<xsl:template match="Class">
    <xsl:value-of select="@Discipline" />
    <xsl:text> </xsl:text>
    <xsl:value-of select="@Number" />
    <xsl:if test="position()!=last()">
        <xsl:text>, </xsl:text>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

使用提供的输入,(文本)输出为:

Basic Skills:
BSKI 8
Others:
BUSA 7, BUSA 72, CHIN 1

答案 1 :(得分:0)

查找更新的:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8"/>

  <xsl:key name="ftclass" match="Fallthrough/Class" use="@Id_num"/>

  <xsl:template match="/">
    <xsl:text>Basic Skills:&#10;</xsl:text>
    <xsl:apply-templates  select="Audit/Clsinfo/Class[key('ftclass', @Id_num)][Attribute/attribute::*='P']"/>
    <xsl:text>&#10;Others:&#10;</xsl:text>
    <xsl:apply-templates select="Audit/Clsinfo/Class[key('ftclass', @Id_num)][not(Attribute/attribute::*='P')]"/>
  </xsl:template>

  <xsl:template match="Class">
    <xsl:value-of select="@Discipline"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="@Number"/>
    <xsl:if test="position()!=last()">
      <xsl:text>, </xsl:text>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

<强>输出:

Basic Skills:
BSKI 8
Others:
BUSA 72, CHIN 1