0

これは、私が使用している XML ファイルの表現です。

<root>
  <header>
  ...
  </header>
  <pupils>
    <pupil>
      <name>Chris</name>
      <assessments>
        <stage>
          <level>1</level>
          <assessment>
            <year>2012</year>
            <result>55</result>
          </assessment>
          ...
        </stage>
      </assessments>
    </pupil>
    ...
  </pupils>
</root>

注: 生徒が LEVEL 1 の ASSESSMENT を持つことは可能ですが、2012 年以外の YEAR です。

2012 年にレベル 1 の評価を受けた生徒を選びたいと思います。

したがって、次の「ネストされたセレクター」メソッドがこれらの生徒を選択するのに正当かどうかを尋ねたいと思います。

select="root/pupils/pupil[assessments/stage/level[../assessment/year = '2012'] = '1']"

( XsltCakeは私が期待するものを返しません)

私の最初の試みはこれをもたらしました:

select="root/pupils/pupil[assessments/stage/level = '1' and assessments/stage/assessment/year = '2012']"

ただし、生徒が 2012 年以外の LEVEL 1 の ASSESSMENT を取得している一方で、2012 年に別の LEVEL の ASSESSMENT を取得している可能性があるため、それらの生徒も選択されます。

4

2 に答える 2

1

XPATH式のフォーカス項目がドキュメントノードであると仮定すると、2012年にレベル1の評価を受けたすべての瞳孔ノードのセットをこのXPATH式で選択できます...

root/pupils/pupil[assessments/stage[level='1'][assessment/year='2012']]

警告

これは、データモデルがサンプルドキュメントによって暗示されているものとほぼ同じであることを前提としています。レベルと評価の間に何らかの関連がある場合、たとえば、共通の瞳孔ノードではなく隣接するノードに基づく場合、式を変える必要があります。

また、現在のフォーカスアイテムが何であるかを推測したくない場合、および<root>要素がドキュメントルート要素である場合は、式の前にスラッシュを付けてください...

/root/pupils/pupil[assessments/stage[level='1'][assessment/year='2012']]

たとえば、このXSLT1.0スタイルシート...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/">
Set of all pupil nodes what had a level 1 assessment in 2012
------------------------------------------------------------- 
  <xsl:apply-templates select="root/pupils/pupil[assessments/stage[level='1'][assessment/year='2012']]"/>
</xsl:template>

<xsl:template match="pupil">
  <xsl:value-of select="concat(' ',name,'&#x0A;')" />
</xsl:template>

</xsl:stylesheet>

...サンプルドキュメントに適用すると、次のようになります。

Set of all pupil nodes what had a level 1 assessment in 2012
------------------------------------------------------------- 
   Chris

原理

はい、一般的な質問に答えるために、XPATH式内の述語をネストすることができます。

于 2012-08-17T09:30:27.517 に答える
0

使用

/*/*/pupil[2012 = assessments/stage[level = 1]/assessment/year]

ここでの主な仮定は、には子assessmentが1つだけあるということstageです。assessmentこれが当てはまらない場合は、質問を編集し、との関係がstageXMLドキュメントでどのように表されるかについての詳細情報を含める必要があります。

XSLTベースの検証

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/*/pupil[2012 = assessments/stage[level = 1]/assessment/year]"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<root>
      <header>
      ...
      </header>
      <pupils>
        <pupil>
          <name>Chris</name>
          <assessments>
            <stage>
              <level>1</level>
              <assessment>
                <year>2012</year>
                <result>55</result>
              </assessment>
              ...
            </stage>
          </assessments>
        </pupil>
        ...
      </pupils>
</root>

Xpath式が評価され、この評価から選択されたノード(この場合は1つのみ)が出力にコピーされます

<pupil>
   <name>Chris</name>
   <assessments>
      <stage>
         <level>1</level>
         <assessment>
            <year>2012</year>
            <result>55</result>
         </assessment>
              ...
            </stage>
   </assessments>
</pupil>
于 2012-08-17T12:32:57.250 に答える