如何检查整个xml中的节点值

时间:2015-02-17 05:05:57

标签: xslt xslt-1.0 xslt-grouping

我有这样的地图,我必须检查姓名' A'在那里和名字' E'在这张地图中不存在,那么我必须做点什么。如何检查xml中的同一节点名称'以及其他一些价值观如何' X'是否存在。

<Map>
<Employee>
    <name>A</name>
    <id>1</id>
    <role>SE</role>
</Employee>
<Employee>
    <name>B</name>
    <id>2</id>
    <role>SE</role>
</Employee>
<Employee>
    <name>C</name>
    <id>3</id>
    <role>SE</role>
</Employee>
<Employee>
    <name>D</name>
    <id>4</id>
    <role>SSE</role>
</Employee>
<Employee>
    <name>E</name>
    <id>5</id>
    <role>SSE</role>
</Employee>

2 个答案:

答案 0 :(得分:0)

您可以检查是否有名为&#34; A&#34;的员工。通过测试(从父节点的上下文):

test="Employee[name='A']"

例如,以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/Map">
    <result>
        <xsl:if test="Employee[name='A']">YES</xsl:if>
    </result>
</xsl:template>

</xsl:stylesheet>

将返回:

<?xml version="1.0" encoding="UTF-8"?>
<result>YES</result>

应用于测试输入

<Map>
    <Employee>
        <name>X</name>
    </Employee>
    <Employee>
        <name>A</name>
    </Employee>
    <Employee>
        <name>B</name>
    </Employee>
</Map>

编辑:

  

我必须测试两个条件1&gt;名称&#39; A&#39;存在且名称&#39; Z&#39;不是   本

这是一个微不足道的扩展:

test="Employee[name='A'] and not(Employee[name='Z'])"

答案 1 :(得分:0)

我认为您所寻找的是一种匹配所有<Map>个节点的方法,其中<Employee>节点具有<Name> ='A',以及否 <Employee>节点<Name> ='X'。

要使用apply-templates执行此操作,您只需要一个这样的简单模板:

<xsl:template match="/Map[Employee/name = 'A' and not (Employee/name = 'X')]">
   <!-- Do whatever you want with the <Map> node here -->
</xsl:template>

如果您将其作为其他逻辑的一部分,您也可以使用<xsl:for-each>(或<xsl:if><xsl:when>),如下所示:

<xsl:for-each select="/Map[Employee/name = 'A' and not (Employee/name = 'X')]">
   <!-- Do whatever you want with the <Map> node here -->
</xsl:for-each>

如果您希望能够指定任意值,可以使用<xsl:call-template>。首先,定义您的模板:

<xsl:template name="DoSomething">
  <xsl:param name="includes" />
  <xsl:param name="does_not_include" />

  <xsl:if test="/Map[Employee/name = $includes and not (Employee/name = $does_not_include)]">
    <!-- Do whatever you want with the <Map> node here -->
  </xsl:if>
</xsl:template>

然后调用您的模板:

<xsl:call-template name="DoSomething">
  <xsl:with-param name="includes" select="'A'" />
  <xsl:with-param name="does_not_include" select="'X'" />
</xsl:call-template>