0
<SMRCRLT_XML>
 <AREA>
  <DETAILS>
   <DETAIL_REQUIREMENT>
    <RULE_REQUIREMENT>
     <DETAIL_REQUIREMENT>
      <COURSE_ROWSET>
       <COURSE_SET>
        <COURSE_AREA>TESTSELECT</COURSE_AREA>
        <COURSE_KEY_RULE>1200</COURSE_KEY_RULE>
        <COURSE_SET>A</COURSE_SET>
        <COURSE_SUBSET>1</COURSE_SUBSET>
        <COURSE_SUBJ_CODE>CHEM</COURSE_SUBJ_CODE>
        <COURSE_CRSE_NUMB_LOW>345A</COURSE_CRSE_NUMB_LOW>
       </COURSE_SET>
      </COURSE_ROWSET>
     </DETAIL_REQUIREMENT>
     <DETAIL_REQUIREMENT>
      <COURSE_ROWSET>
       <COURSE_SET>
        <COURSE_KEY_RULE>1200</COURSE_KEY_RULE>
        <COURSE_SET>A</COURSE_SET>
        <COURSE_SUBSET>2</COURSE_SUBSET>
        <COURSE_SUBJ_CODE>CHEM</COURSE_SUBJ_CODE>
        <COURSE_CRSE_NUMB_LOW>476A</COURSE_CRSE_NUMB_LOW>
       </COURSE_SET>
      </COURSE_ROWSET>
     </DETAIL_REQUIREMENT>
     <DETAIL_REQUIREMENT>
      <COURSE_ROWSET>
       <COURSE_SET>
        <COURSE_AREA>TESTSELECT</COURSE_AREA>
        <COURSE_KEY_RULE>1200</COURSE_KEY_RULE>
        <COURSE_SET>A</COURSE_SET>
        <COURSE_SUBSET>3</COURSE_SUBSET>
        <COURSE_SUBJ_CODE>PHIL</COURSE_SUBJ_CODE>
        <COURSE_CRSE_NUMB_LOW>432</COURSE_CRSE_NUMB_LOW>
       </COURSE_SET>
      </COURSE_ROWSET>
     </DETAIL_REQUIREMENT>
     <DETAIL_REQUIREMENT>
      <COURSE_ROWSET>
       <COURSE_SET>
        <COURSE_AREA>TESTSELECT</COURSE_AREA>
        <COURSE_KEY_RULE>1200</COURSE_KEY_RULE>
        <COURSE_SET>B</COURSE_SET>
        <COURSE_SUBSET>4</COURSE_SUBSET>
        <COURSE_SUBJ_CODE>PHIL</COURSE_SUBJ_CODE>
        <COURSE_SUBJ_DESC>Philosophy</COURSE_SUBJ_DESC>
        <COURSE_CRSE_NUMB_LOW>433</COURSE_CRSE_NUMB_LOW>
       </COURSE_SET>
      </COURSE_ROWSET>
     </DETAIL_REQUIREMENT>
     <DETAIL_REQUIREMENT>
      <COURSE_ROWSET>
       <COURSE_SET>
        <COURSE_AREA>TESTSELECT</COURSE_AREA>
        <COURSE_KEY_RULE>1200</COURSE_KEY_RULE>
        <COURSE_SET>B</COURSE_SET>
        <COURSE_SUBSET>5</COURSE_SUBSET>
        <COURSE_SUBJ_CODE>ZOOL</COURSE_SUBJ_CODE>
        <COURSE_CRSE_NUMB_LOW>321</COURSE_CRSE_NUMB_LOW>
       </COURSE_SET>
      </COURSE_ROWSET>
     </DETAIL_REQUIREMENT>
     <DETAIL_REQUIREMENT>
      <COURSE_ROWSET>
       <COURSE_SET>
        <COURSE_AREA>TESTSELECT</COURSE_AREA>
        <COURSE_KEY_RULE>1200</COURSE_KEY_RULE>
        <COURSE_SET>B</COURSE_SET>
        <COURSE_SUBSET>6</COURSE_SUBSET>
        <COURSE_SUBJ_CODE>BIOC</COURSE_SUBJ_CODE>
        <COURSE_CRSE_NUMB_LOW>456</COURSE_CRSE_NUMB_LOW>
       </COURSE_SET>
      </COURSE_ROWSET>
     </DETAIL_REQUIREMENT>
    </RULE_REQUIREMENT>
   </DETAIL_REQUIREMENT>
  </DETAILS>
 </AREA>
</SMRCRLT_XML>

我试图从每个 COURSE_SET 的 XML 中获取第一个元素,但它返回所有值。有人可以帮忙吗。这是我应用的模板:

<xsl:apply-templates select="//SMRCRLT_XML/AREA/DETAILS/DETAIL_REQUIREMENT/RULE_REQUIREMENT/DETAIL_REQUIREMENT/COURSE_ROWSET/COURSE_SET[COURSE_AREA='TESTSELECT' and COURSE_KEY_RULE='1200'][1]"/>

我得到的结果是:

CHEM345A
PHIL432
PHIL433
ZOOL321
BIOC456

我正在寻找的结果是 CHEM 345A,然后是 PHIL433

4

2 回答 2

2

你在这里有几个问题。

首先,[1]在您的 XPath 表达式中,通过要求选择的 COURSE_SET 元素是其父元素的第一个子元素来过滤 XPath 值。没有它[1],您的 XPath 表达式将显示为:

//SMRCRLT_XML
/AREA
/DETAILS
/DETAIL_REQUIREMENT
/RULE_REQUIREMENT
/DETAIL_REQUIREMENT
/COURSE_ROWSET
/COURSE_SET
[COURSE_AREA='TESTSELECT' and COURSE_KEY_RULE='1200']

但是每个匹配该路径表达式的 COURSE_SET 都是其父级的第一个子级。(唯一不是第一个孩子的 COURSE_SET 元素是 COURSE_SET 的孩子,而不是 COURSE_ROWSET 的孩子。)

第二个问题是,根据您的问题和您尝试制定所需的 XPath 表达式来判断,您希望以某种方式对课程进行分组(起初我以为您可能希望按部门对它们进行分组,但现在我希望您希望它们按嵌套 COURSE_SET 元素的值(在您的示例中具有值 A 或 B)进行分组,以便通过在某些合适的上下文中选择第一个 COURSE_SET ,您可以获得为每个组列出的第一门课程。但是您显示的 XML 实际上并没有按部门或按课程集对课程进行分组;它提供了一个完全没有分组的课程列表。这里没有任何元素 CHEM 345A 和 PHIL 433 是第一门课程。

如果您的设计要求按部门或课程集对课程进行分组,那么您的数据源没有提供您想要的数据,您需要对其进行修复。

另一方面,如果您被此 XML 卡住并想使用 XPath 来尝试提供您的数据源无法提供的结构,那么您想要“每个 COURSE_SET 的第一个元素”,您想要“与前一个 COURSE_SET 不同的部门(或 COURSE_SET)中的每个 COURSE_SET”。您的 XPath 表达式可能类似于

//COURSE_ROWSET/COURSE_SET
  [not(COURSE_SET eq preceding::COURSE_SET[1])]

您的第三个问题是您的 XML 似乎太喜欢为不同的结构使用相同的名称(一组 COURSE_SET 元素,每个元素都包含课程描述,部门和课程编号等,第二组COURSE_SET 元素,包含字符串 'A' 和 'B',两组不同内容的 DETAIL_REQUIREMENT 等等。这会让不熟悉数据的人感到困惑,并且会让每一次对细节的讨论成为误传和误传的机会。错误。

于 2013-02-06T01:22:20.277 回答
0

在 XSLT 1.0 中处理此类任务的有效方法是使用 Muenchian 分组,如下所示:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:key name="kSet" match="COURSE_ROWSET/COURSE_SET" use="COURSE_SET" />

  <xsl:template match="/">
    <root>
      <xsl:apply-templates
        select="//COURSE_ROWSET/COURSE_SET[generate-id() = 
                  generate-id(key('kSet', COURSE_SET)[1])]" />
    </root>
  </xsl:template>

  <xsl:template match="COURSE_ROWSET/COURSE_SET">
    <item>
      <xsl:value-of select="concat(COURSE_SUBJ_CODE, COURSE_CRSE_NUMB_LOW)"/>
    </item>
  </xsl:template>
</xsl:stylesheet>

将此 XSLT 应用于示例输入时,结果为:

<root>
  <item>CHEM345A</item>
  <item>PHIL433</item>
</root>
于 2013-02-06T04:43:06.783 回答