Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算XSLT中的动态xml节点?_Xml_Dynamic_Count_Nodes - Fatal编程技术网

如何计算XSLT中的动态xml节点?

如何计算XSLT中的动态xml节点?,xml,dynamic,count,nodes,Xml,Dynamic,Count,Nodes,在这种情况下,我希望根据每个节点顶部设置的条件计算返回的标记数 我有将近20个旗子,如下面的例子所示。我们不知道其中有多少是真的。如果标志为TRUE,则将返回自定义文本。我想知道归还的旗帜的数量。我尝试了许多使用变量的方法,但没有成功 <!--CPSOR ALERT FLAG--> <xsl:if test="Person/PersonInfo/CPSORFlag ='true'"> <scope:PersonAlert&

在这种情况下,我希望根据每个节点顶部设置的条件计算返回的标记数

我有将近20个旗子,如下面的例子所示。我们不知道其中有多少是真的。如果标志为TRUE,则将返回自定义文本。我想知道归还的旗帜的数量。我尝试了许多使用变量的方法,但没有成功

<!--CPSOR ALERT FLAG-->
<xsl:if test="Person/PersonInfo/CPSORFlag ='true'">                    
  <scope:PersonAlert>
    <!--PersonAlerts.PersonAlertText-->
    <scope:AlertText>                        
      <xsl:text>CONV PER/SOFF</xsl:text>
    </scope:AlertText>
  </scope:PersonAlert>
</xsl:if>
<!--CERTASADULT ALERT FLAG-->
<xsl:if test="Person/PersonInfo/CertAsAdultFlag ='true'">
   <scope:PersonAlert>
    <!--PersonAlerts.PersonAlertText-->
    <scope:AlertText>
      <xsl:text>CERT ADULT</xsl:text>
    </scope:AlertText>
  </scope:PersonAlert>
</xsl:if>
<!--DECEASED ALERT FLAG-->
<xsl:if test="Person/PersonInfo/DeceasedFlag ='true'">
  <scope:PersonAlert>
    <!--PersonAlerts.PersonAlertText-->
    <scope:AlertText>
      <xsl:text>DECEASED</xsl:text>
    </scope:AlertText>
  </scope:PersonAlert>
</xsl:if>

会议室/会议室
成人证书
已故的
这是示例XML


假设您的XML是这样的:

<root>
  <Person>
    <PersonInfo>
      <CPSORFlag>true</CPSORFlag>
    </PersonInfo>
  </Person>
  <Person>
    <PersonInfo>
      <ConditonalReleaseFlag>true</ConditonalReleaseFlag>
    </PersonInfo>
  </Person>
  <Person>
    <PersonInfo>
      <MissingFlag>true</MissingFlag>
    </PersonInfo>
  </Person>
</root>

真的
真的
真的
使用count()函数



在上面显示的过滤器中添加所有不同类型的标志

[CPSORFlag='true'或其他…]

这是一个经过验证的例子

编辑

考虑到您新粘贴的XML,此模板应该可以做到这一点

XML

 <Person>
    <PersonInfo>
      <CPSORFlag>true</CPSORFlag>
       <MissingFlag>true</MissingFlag>
       <ConditonalReleaseFlag>true</ConditonalReleaseFlag>
    </PersonInfo>
  </Person>

真的
真的
真的
样式表

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:java="http://xml.apache.org/xslt/java" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="java" version="1.0">
  <xsl:output media-type="text/xml" method="xml"/>
  <!-- Filters refdoc based on condition and  data  -->
  <xsl:template match="/">
    <xsl:apply-templates select="//PersonInfo"/>
  </xsl:template>

  <xsl:template match="PersonInfo">
    <NumberOfFlags>
         <xsl:value-of select="count(CPSORFlag[.='true']|MissingFlag[.='true']|ConditonalReleaseFlag[.='true'])"/>
     </NumberOfFlags>
  </xsl:template>
</xsl:stylesheet>

只需在count函数中添加一个带有|符号的新标志

<NumberOfFlags>
<xsl:value-of select="count(//Person/PersonInfo[CPSORFlag[.='true'] or CPSORFlag[.='true']])"/>
</NumberOfFlags>

CPSORFlag[.='true']| MissingFlag[.='true']

一般问题的典型示例:您希望从相同的输入数据计算两个不同的结果。有几种方法

(a) 咬紧牙关,对输入进行两次处理。这是solytion james31rock选择的

(b) 与(a)相同,但尝试多次识别要计算的表达式,并将这些表达式的结果放入变量中,以避免重复计算

(c) 将第一次计算的结果放入变量中,并对该变量的结果执行第二次计算

我想我会倾向于按照(b)的思路做一些事情。这是XSLT 2.0——如果你付给我很多钱,我只做XSLT 1.0。另外,我假设像
Person/PersonInfo/CPSORFlag
这样的表达式都选择一个节点

<xsl:variable name="flags" select="Person/PersonInfo/(CPSORFlag, CertAsAdultFlag, DeceasedFlag, ....)"/>

<xsl:variable name="count" select="count($flags[.='true'])"/>

<xsl:apply-templates select="$flags[. = 'true']"/>

然后


会议室/会议室
成人证书
已故的
等

?在旗帜旁边还有其他信息吗?需要一些xml结构的知识我的新解决方案是否适合您?我看到你对迈克尔·凯的评论了。嗨,詹姆斯,现在还没起作用。我不知道为什么会这样。有没有办法,我可以通过电子邮件向您发送我正在使用的XSL?这样你就可以清楚地看到这个问题。因为这是一个很大的文件,我不能把它放在这里。谢谢你的回复。不幸的是,我仍然无法完成计数工作。每次我都会得到1的计数值。@Harshavardhanjasshi,我编辑了我的文章。如果我发布的不是你的XML,请提供你的XML。非常感谢你的回复,詹姆斯。嗨,詹姆斯。我已将示例XML附加为图像。请检查一下,如果您需要更多信息,请告诉我。再次感谢您的时间和帮助。@Harshavardhanjasshi我编辑了我的帖子。我提供的新样式表应该可以做到这一点。嗨,Michael。谢谢你的回复。我仍然无法让计数工作。下面是我在看了您的和James的示例后尝试的代码:-您似乎在计算与特定条件匹配的ArrayOfPersonInfo元素的数量,但您的输入中只有一个ArrayOfPersonInfo元素。真的,如果你不使用我给你的解决方案,你不能指望我告诉你为什么你的解决方案不起作用。先生,我对你的误解深表歉意。我尝试了你的解决方案,但它出现了错误。下面这行代码总是出错。请让我知道我是否应该改变一些东西,也许你没有注意到我说的它需要XSLT2.0处理器。如果不是,告诉我错误是什么可能会有所帮助。不,版本是正确的。。
<xsl:variable name="flags" select="Person/PersonInfo/(CPSORFlag, CertAsAdultFlag, DeceasedFlag, ....)"/>

<xsl:variable name="count" select="count($flags[.='true'])"/>

<xsl:apply-templates select="$flags[. = 'true']"/>
<xsl:template match="Person/PersonInfo/*" priority="5">
   <scope:PersonAlert>
    <!--PersonAlerts.PersonAlertText-->
    <scope:AlertText>
      <xsl:next-match/>
    </scope:AlertText>
  </scope:PersonAlert>
</xsl:template>

<xsl:template match="CPSORFlag" priority="4">CONV PER/SOFF</xsl:template>
<xsl:template match="CertAsAdultFlag" priority="4">CERT ADULT</xsl:template>
<xsl:template match="DeceasedFlag" priority="4">DECEASED</xsl:template>

etc