如何为每个项目取决于孩子的孩子价值观?

时间:2018-02-12 14:28:57

标签: xml xslt

如何使用取决于孩子孩子的价值的条件制作for-each元素?

项目的XML示例:

<z:item>
  <z:publications>
      <z:publication>
         <z:mediaKey>a</z:mediaKey>
         <z:publicationStatus>published</z:publicationStatus>
      </z:publication>
      <z:publication>
         <z:mediaKey>b</z:mediaKey>
         <z:publicationStatus>ready</z:publicationStatus>
      </z:publication>
      <z:publication>
         <z:mediaKey>c</z:mediaKey>
         <z:publicationStatus>ready</z:publicationStatus>
      </z:publication>
   </z:publications>
</z:item>

现在,我想对for-eachmediaKey!=a的所有项目进行publicationStatus=published

我试过了:

<xsl:for-each select="//z:item[z:publication/@status = 'published' and z:publication/@mediaKey != 'zgonline']">

但这是错误的,因为它还包括上面的项目a/published而其他项目只处于就绪状态。

当我这样做时:

<xsl:for-each select="//z:item/z:publication[@status = 'published' and @mediaKey != 'zgonline']">

然后它选择正确的publication个节点,但结果节点集将包含上述item的两倍,因为它满足选择标准的两倍....

我其实想做这样的事情:

<xsl:for-each select="//z:item[z:publication[@status = 'published' and @mediaKey != 'zgonline']]">

我该怎么做?

2 个答案:

答案 0 :(得分:0)

我认为

  

[你]希望为拥有z:itemmediaKey!='a'的所有publicationStatus='published'制作一个for-each。

如果这个(你的)问题是正确的,那么正确答案将是

<xsl:for-each select="//z:item[z:publications/z:publication/z:publicationStatus = 'published' and z:publications/z:publication/z:mediaKey != 'a']">  
  <xsl:text>MATCHED</xsl:text>
</xsl:for-each>

将循环遍历具有给定值的这两个子节点的所有z:item

答案 1 :(得分:0)

我刚刚发现这个解决方案工作得很好,你可以有嵌套条件:

<xsl:for-each select="//z:item[z:publication[@status = 'published' and @mediaKey != 'zgonline']]">

但是,@ zx485的建议解决方案也有效:

<xsl:for-each select="//z:item[z:publications/z:publication/z:publicationStatus = 'published' and z:publications/z:publication/z:mediaKey != 'a']">