如何选择多个节点的值并在单个条件下对其进行测试?

How to pick value of multiple nodes and test it in a single condition?

作为此 post 的延续,我重构了代码以更好地理解我的要求。我也提供了更多细节。

XML 文件

<Person>
  <Name>Kavya</Name>
  <Gift>
    <ItemName>PD1</ItemName>
  </Gift>
  <Gift>
    <ItemName>PS1</ItemName>
  </Gift>
  <Gift>
    <ItemName>PD2</ItemName>
  </Gift>
</Person>

现在,在上面的结构中,我需要 return 文本 Successfull 只有当 PersonGift ItemName empty 或者只有 PS1 而不是 PD1PD2。因此,在编写 XSLT 文件时,我使用了以下方法:

XSLT 文件(示例)

<Test>
  <xsl:choose>
    <xsl:when test="//Person/Gift[ItemName='PS1' and ItemName!='PD1']">
      <xsl:text>Successfull</xsl:text>
    </xsl:when>
  </xsl:choose>
</Test>

截至目前,它 return 成功了,因为其中一件礼物的 ItemName 为 'PS1'。但是,根据我的需要,它不能显示任何东西,因为虽然有一个 ItemName 为 'PS1',但该人还拥有 ItemName 为 'PD1' 和 'PD2'

的礼物

准确的说,我不想查看Gift中的个别ItemName。我正在尝试检查这个人(作为一个整体)是否有 PS1 而不是 PD1 或 PD2

希望这是清楚的。请协助。

在 XSLT 2.0 中,您可以使用 exists():

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/Person">
    <xsl:choose>
      <xsl:when test="./Gift[ItemName='PS1'] and not(exists(./Gift[ItemName='PD1']))">
        <xsl:text>Sample</xsl:text>
      </xsl:when>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>