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

时间:2021-02-10 07:37:44

标签: xml xslt xslt-1.0 xslt-2.0 xslt-3.0

为了继续这个 post,我重新构造了代码以更好地理解我的要求。我还提供了更多细节。

XML 文件

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

现在,在上述结构中,仅当 Person 具有 GiftItemName 时,我才需要返回文本 Successfull 或只有 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>

截至目前,它返回成功,因为其中一个礼物的 ItemName 为“PS1”。但是,根据我的需要,它不能显示任何内容,因为虽然有一个 ItemName 为 'PS1',但该人仍然拥有 ItemName 为 'PD1' 和 'PD2' 的礼物

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

希望这很清楚。请协助。

1 个答案:

答案 0 :(得分:1)

在 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>