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_ROWSET の子ではなく、COURSE_SET の子です。)

2 番目の問題は、あなたの質問と、必要な 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])]

3 番目の問題は、XML が異なる構造体に同じ名前を使用するのが好きすぎるように見えることです (それぞれがコースの説明、部門やコース番号などを含む COURSE_SET 要素の 1 つのセットと、文字列 'A' と 'B' を含む COURSE_SET 要素、異なる内容の DETAIL_REQUIREMENT の 2 つのセットなど. データに慣れていない人にとっては混乱を招きます.エラー。

于 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 に答える