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>

注意:学生可以在 2012 年以外的一年进行 1 级的评估。

我希望从 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 年以外的一年内进行 1 级的评估,同时在 2012 年进行不同级别的评估,因此也会选择这些学生。

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']]

例子

例如,这个 XSLT 1.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]

这里的主要假设是 anassessment只有一个stage孩子。如果不是这样,您需要编辑问题并包含有关如何在 XML 文档中表示anassessment及其对应项之间的关系的更多信息。stage

基于 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 表达式进行求值,并将该求值中选定的节点(本例中只有一个)复制到输出

<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 回答