XSLT - 确定具有多个相同命名节点的节点中是否存在值

时间:2018-03-15 18:00:23

标签: xml xslt

想要确定XML中是否存在BBB。我可以有效地回应它,如下所示。如何有效搜索PRODUCT_CODE节点以确定组中是否存在BBB?

XML:

<ECOMM_VARS>
  <PRODUCT_CODE>AAA</PRODUCT_CODE>
  <PRODUCT_CODE>BBB</PRODUCT_CODE>
  <PRODUCT_CODE>CCC</PRODUCT_CODE>
</ECOMM_VARS>

XSLT:

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

  <xsl:template match="PRODUCT_CODE">
    <xsl:value-of select="concat(., '&#xA;')"/>
  </xsl:template>

  <xsl:template match="text()"/>

</xsl:stylesheet>

2 个答案:

答案 0 :(得分:1)

测试存在是评估ifchoose中的XPath谓词表达式的结果:

<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="//PRODUCT_CODE[text()='BBB']">true</xsl:when>
        <xsl:otherwise>false</xsl:otherwise>
    </xsl:choose>
</xsl:template>

如果任何true节点的文字等于<PRODUCT_CODE>,则会输出'BBB'

答案 1 :(得分:1)

您可以在匹配的模板上使用谓词 以下示例仅匹配第一次(由[1]表示)<PRODUCT_CODE>元素的文本与字符串'BBB'匹配。

<xsl:template match="PRODUCT_CODE[text() = 'BBB'][1]">
  <!-- Only matches the first time 'BBB' occurs -->
  <xsl:value-of select="concat(., '&#xA;')"/>
</xsl:template>

如果确实存在一个或多个带有<PRODUCT_CODE>文字的'BBB'元素,则它与完全匹配一次。